当前位置:文档之家› 数据结构表达式求值代码

数据结构表达式求值代码

//代码部分:
#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef char ElemType;//定义栈
typedef struct{
char a[MAXSIZE];
int top;//栈顶指针
}SqStack;
char op[8]={'+','-','*','/','(',')','#'};//运算符集
char ch[7][7]={ //运算符优先关系集{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<',' ','='}
};
void InitStack(SqStack &s)
{
for(int i=0;i<MAXSIZE;i++)
s.a[i]=0;
s.top=0;
}
char Push(SqStack &s,ElemType e)
{
if (s.top==MAXSIZE-1) cout<<"Overflow!"<<endl;
else
{ s.top=s.top+1;
s.a[s.top-1]=e;
}
return e;
ElemType Pop(SqStack &s,ElemType &e)
{
if (s.top==0)
{
cout<<"Stack is empty!"<<endl; return(-1);
}
else
{
e=s.a[s.top-1];
s.top=s.top-1;
return e;
}
}
ElemType GetTop(SqStack s,ElemType& e)
{
if (s.top==0) { cout<<"Stack is empty!"<<endl; return(-1); } else
e=s.a[s.top-1];
return e;
}
bool ifnot(char c)//判断是否是运算符
{
for(int i=0;i<8;i++)
{
if (c==op[i])
return 1;}
return 0;
}
int FirstValue(char ch) //判断字符在数组中的位置
{
int k;
switch(ch)
{
case '+':k=0;break;
case '-':k=1;break;
case '*':k=2;break;
case '/':k=3;break;
case '(':k=4;break;
case ')':k=5;break;
case '#':k=6;break;
}
return k;
}
char Precede(char ch1,char ch2)//判断优先关系的函数
{
int i=0,j=0;
i=FirstValue(ch1);//调用函数
j=FirstValue(ch2);//调用函数
return ch[i][j];//返回优先关系的字符
}
char Operate(int ch3,char theta ,int b)
{
int result;
if(theta=='+'){result=(ch3-'0')+(b-'0');}
if(theta=='-'){result=(ch3-'0')-(b-'0');}
if(theta=='*'){result=(ch3-'0')*(b-'0');}
if(theta=='/'){result=(ch3-'0')/(b-'0');}
return (result+'0');
}
int main()
{
char c;//用来接收字符
char x,theta,e,b,a1,m;//定义临时的字符变量
x=m=theta=e=b=a1=NULL;//给临时变量赋值
SqStack OPTR,OPND;//定义运算符栈和操作数栈
InitStack(OPTR) ;Push(OPTR,'#');//初始化,让#是运算符栈底元素InitStack(OPND);//初始化操作数栈
cout<<"请输入表达式,以#结束"<<endl;
c=getchar();
while(c!='#'||GetTop(OPTR,e)!='#')
{
if(!ifnot(c))//判断是否是运算符
{
Push(OPND,c);
c=getchar();
}//不是运算符则进栈
else
switch (Precede(GetTop(OPTR,e),c))
{
case'<':Push(OPTR,c);c=getchar();break;//栈顶元素优先权低
case'=':Pop(OPTR,x);c=getchar();break;//脱括号并接受下一字符
case'>':Pop(OPTR,theta);Pop(OPND,b);Pop(OPND,a1);//退栈并将运算结果入栈
Push(OPND,Operate(a1,theta,b));
break;
}//swith
}//while
m=GetTop(OPND,e);
cout<<"the last result is "<<m-'0'<<endl;//输出最后结果
return 0;
}
//代码结束:
运行结果:。

相关主题