#include<iostream>
#define OK 1
#define ERROR 0
using namespace std;
typedef char Elemtype;
typedef int Status;
//链栈存储结构
typedef struct Node
{
Elemtype data;
struct Node* next;
}Node, * LinkStack;
//初始化
Status InitStack(LinkStack &S)
{
S = NULL;
return OK;
}
//入栈
Status Push(LinkStack &S, Elemtype e) //栈顶插入元素e
{
LinkStack p = new Node; //生成新节点
p->data = e; //新节点数据域置为e
p->next = S; //将新节点插入栈顶
S = p; //修改栈顶指针为p
return OK;
}
//出栈
Status Pop(LinkStack &S, Elemtype &e)
{
if (S == NULL) //栈为空
return ERROR;
LinkStack p; //定义临时链栈
e = S->data; //将栈顶元素赋值给e
p = S; //临时存储栈顶空间,以备释放
S = S->next; //修改栈顶指针
delete p; //删除栈顶指针
return OK;
}
//取栈顶元素
Elemtype Gettop(LinkStack S)
{
if (S != NULL) //栈非空
return S->data;
}
//判断读入字符是否是运算符
Status In(Elemtype ch)
{
if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')'||ch=='#')
return OK;
else
return ERROR;
}
//判断运算符栈顶元素与读入运算符优先级
Elemtype Precede(Elemtype a, Elemtype b)
{
if (a == '+' || a == '-') {
if (b == '+' || b == '-' || b == '#' || b == ')')
return '>';
else
return '<';
}
if (a == '*' || a == '/') {
if (b == '(')
return '<';
else
return '>';
}
if (a == '(') {
if (b == ')')
return '=';
else
return '<';
}
if (a == '#') {
if (b == '#')
return '=';
else
return '<';
}
if (a == ')')
return '>';
}
//计算
Elemtype Operate(Elemtype a, Elemtype t, Elemtype b)
{
switch (t) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
}
}
void Eval_expression()
{
LinkStack OPND, OPTR; //定义栈
Elemtype ch, t, t1, t2;
InitStack(OPND); //初始化操作数栈
InitStack(OPTR); //初始化运算符栈
Push(OPTR,'#'); //入栈
cin >> ch;
while (ch != '#' || Gettop(OPTR) != '#')
{
if (!In(ch)) //不是运算符情况
{
Push(OPND, ch-'0'); //进入OPND栈
cin >> ch; //读取下一个字符
}
else //是运算符情况
switch (Precede(Gettop(OPTR), ch))
{
case '<':
Push(OPTR, ch); //将ch压入OPTR栈
cin >> ch; //读取下一个字符
break;
case '>':
Pop(OPTR, t); //弹出OPTR栈顶运算符,赋值给t
Pop(OPND, t2); //后进先出
Pop(OPND, t1); //弹出OPND栈顶两个运算数
Push(OPND, Operate(t1, t, t2)); //将运算结果压入OPND栈
break;
case '=': //OPTR栈顶元素是'('且ch是')'
Pop(OPTR, t); //弹出栈顶'('
cin >> ch; //读取下一个字符
break;
}
}
cout<<(int)Gettop(OPND)<<endl; //将char转换为int
}
int main()
{
cout << "请输入要计算的表达式(操作数和结果都在0-9的范围内,以#结束):" << endl;
Eval_expression();
return 0;
}