可能运行不出来,目的是用栈实现表达式求值
#include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
using namespace std;
char fuhao[7]={'+','-','*','/','(',')','#'};
typedef char SElemType;//定义一个变量
typedef int Status;
typedef struct SNode//定义一个栈结构体
{
int data;
struct SNode *next;
} SNode,*LinkStack;
char EvaluateExpression()
{
char ch,theta,a,b,x,top;
SNode OPTR,OPND;//创建栈
InitStack(OPTR);//初始化两个栈 ,这个是运算符
InitStack(OPND);//操作数和运算结果
push(OPTR,'#');
cin>>ch;
while(ch!='#'||(GetTop(OPTR)!='#'))//表达式没有扫描完毕或OPTR的栈顶元素不为“#“
//循环继续 ,遍历整个式子。
{
if(!In(ch))//如果不为符号
{
push(OPND,ch);//给他压到OPND里
cin>>ch;//读下一个字符
}
else
{
switch(Precede(GetTop(),ch))//比较OPTR栈顶的那个和ch的优先级,并回带一个结果给switch
{
case '<':
push(OPTR,ch);//把当前ch压到OPTR里
cin>>ch; //读取下一个ch字符
break;//跳出switch循环
case '>':
pop(OPTR,theta);//弹出OPTR栈顶的符号,并把它给theta
pop(OPND,b);//弹出OPND栈顶的数,给b
pop(OPND,a);//弹出OPND栈顶的数,给a
push(OPND,operate(a,theta,b));//把 a,theta,b给函数operate,运算完成后压入OPND
break;//跳出switch循环
case '=':
pop(OPTR,x);//弹出OPTD栈顶元素给x
cin>>ch;// 读取下一元素
break;//跳出switch循环
}
}
}
return GetTop(OPND)//回带OPND栈顶元素,即计算结果
}
int InitStack(LinkStack &S)//初始化栈函数
{
S= NULL;
return OK;
}
int push(LinkStack &S,SElemType e)//压栈
{
SNode *p=new SNode;//新建一个p
if(!p)//如果p创建失败,返回OVERFLOW
{
return OVERFLOW;
}
p->data=e;//把e给 p->data
p->next=S;//把S给 p->next
S=p;//把p给S
return OK;
}
char pop(LinkStack &S,SElemType e)//弹栈
{
SNode *p;
if(!S)//如果s为空栈,返回ERROR
{
return ERROR;
}
e=S->data;//把S的数据给e
p=S;//把S整体给p
S=S->next//把S的下一个 给S
delete p;//删除p
return OK;
}
int GetTop(LinkStack &S)//取栈顶的S->data
{
if(!S)//如果S为空,返回ERROR
{
return ERROR;
}
return S->data;//返回S的data
}
int In(char ch)//判断ch是否为运算符
{
int i;//定义循环变量i
for(i=0;i<7;i++)
{
if(ch==fuhao[i])
{
return true;
}
else
{
return false;
}
}
}
int Precede(char theta1,char theta2)//比较运算符号优先级
{
if ((theta1 == '(' && theta2 == ')') || (theta1 == '#' && theta2 == '#'))
{
return '=';//如果 二者为左右小括号或二者为井号,则优先级相同
}
else if (theta1 == '(' || theta1 == '#' || theta2 == '(' || (theta1== '+' || theta1 == '-') && (theta2 == '*' || theta2 == '/'))
{
return '<';//如果前者为(、#、 或后为(; 或当前者为+后者为-、且前者为*后者为/时,整体为小于关系
}
else
return '>';//其余情况均为大于关系
}
char Operate(char first, char theta, char second)//计算两数运算结果
{
switch (theta)
{
case '+':
return first+second;
case '-':
return first-second;
case '*':
return first*second;
case '/':
return first/second;
}
}
int main()
{
char a;
cout<<"请输入要计算的式子"<<endl;
cin>>a;
char res = EvaluateExpression(a);
cout << "计算结果为" << res<< endl << endl;
}