sy2-1-2


#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;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值