【题目】
任何一个表达式都由操作数、运算符和界限符组成的,为了叙述的简洁,在此仅讨论简单算数表达式的求值问题,这种表达式只包含加、减、乘、除4种运算符。
例如:
控制台输入 2*(2+3)-5+4*5
控制台输出 25
我们知道,算术四则运算遵循以下3条规则:
1、先乘除后加减
2、从左到右运算
3、先括号内后括号外
【思路分析】
1、通过for循环索引来遍历我们输入的表达式
2、如果索引处的值是数字就直接压入数字栈
3、如果索引处的值是运算符分两种情况
3.1、如果符号栈为空就直接入栈
3.2、如果符号栈中有运算符,将当前运算符优先级与栈顶运算符的优先级比较。如果当前运算符优先级小于或等于栈顶运算符的优先级,就需要从数字栈中弹出两个数并从符号栈中弹出一个运算符。进行运算后将结果入数字栈,循环直至当前运算符优先级大于栈顶运算符的优先级将,然后当前运算符入符号栈。如果当前运算符优先级大于栈顶运算符的优先级,就直接入符号栈。如果是"(“号就直接入符号栈,如果是”)"就从数字栈中弹出两个数并从符号栈中弹出一个运算符。进行运算后将结果入数字栈,循环这个操作直至遇到")“符号,将”)"符号弹出。
4、当表达式扫面完毕,就按顺序从数字栈中弹出两个数字从符号栈中弹出一个运算符,将运行结果压入数字栈
5、重复第4不操作直至数字栈中只剩一个数字,这个数字就是表达式的结果
【完整代码】
#include<iostream>
#include <string>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
using namespace std;
typedef int Status;
typedef int SElemType;
typedef struct {
SElemType* base;//栈低指针
SElemType* top;//栈顶指针
int stackSize;//栈可用最大容量
}SqStack;
/**
*初始化顺序栈
*/
Status InitStack(SqStack &s){
s.base = new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if(!s.base) exit(ERROR);
s.top = s.base;
s.stackSize = MAXSIZE;
return OK;
}
/**
*入栈
* */
Status Push(SqStack &s,SElemType e){
if(s.top-s.base == s.stackSize)//为什么不s.top>s.stackSize 因为s.top是指针s.stackSize是int
return ERROR;
*s.top=e;//*解引用
s.top ++