源程序及注释
#include<iostream>
using namespace std;
#define ERROR 0
#define OK 1
typedef int SElemType;
typedef int Status;
#define MAXSIZE 100 //顺序栈存储空间的初始分配量
//顺序站的存储结构
typedef struct {
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈可用的最大容量
}SqStack;
//初始化操作
Status InitStack(SqStack &S)
{
//构造一个空栈
S.base = new SElemType[MAXSIZE]; //动态分配一个MAXSIZE的数组存储空间
if (!S.base)
{
cout << "初始化失败" << endl; //存储分配失败
exit(OVERFLOW);
}
cout << "初始化成功" << endl;
S.top = S.base; //top初始为base,空栈
S.stacksize = MAXSIZE; //stacksize放置栈的最大容量
return OK;
}
//入栈
Status Push(SqStack &S, SElemType e)
{
if (S.top - S.base == S.stacksize)
{
return ERROR;
}
*S.top++ = e;
//*S.top=e;
//S.top++;
return OK;
}
//出栈
Status Pop(SqStack &S, SElemType &e)
{//删除S的栈顶元素,用e返回其值
if (S.top == S.base)
return ERROR;
e = *--S.top;
return OK;
}
//取栈顶元素
Status GetTop(SqStack S)
{ //返回S的栈顶元素,不修改栈顶指针
if (S.top != S.base)
return *(S.top - 1);
}
//判断c是否为七种算符之一
bool In(char ch)
{
switch (ch)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#':return OK;
default:return ERROR;
}
}
//判断算符的优先级
char Precede(char c1, char c2) {
char r;
//+-的判断相同
if ((c1 == '+' || c1 == '-') && (c2 == '+' || c2 == '-' || c2 == ')'
|| c2 == '#')) r = '>';
else if ((c1 == '+' || c1 == '-') && (c2 == '*' || c2 == '/'
|| c2 == '(')) r = '<';
//*/的判断相同
else if ((c1 == '*' || c1 == '/') && (c2 == '+' || c2 == '-' || c2 == ')' ||c2== '*' ||c2== '/'
|| c2 == '#'))
r = '>';
else if ((c1 == '*' || c1 == '/') && (c2 == '('))
r = '<';
//"("判断
else if ((c1 == '(')&&(c2== '+' ||c2== '-' ||c2== '*'
|| c2 == '/' || c2 == '('))
r = '<';
else if (c1 == '('&&c2 == ')')
r = '=';
else if (c1 == '('&&c2 == '#')
{
cout << "error!没有右括号!" << endl;
exit(-1);
}
//")"判断
else if ((c1 == ')') && (c2 == '+' || c2 == '-' || c2 == '*'
|| c2 == '/' || c2 == '#'))
r = '>';
else if (c1 == ')'&&c2 == '(')
{
cout << "error!" << endl;
exit(-1);
}
//"#"判断
else if ((c1 == '#') && (c2 == '+' || c2 == '-' || c2 == '*'
|| c2 == '/' || c2 == '('))
r = '<';
else if (c1 == '#'&&c2 == '#')
r = '=';
else if (c1 == '#'&&c2 == ')')
{
cout << "error!" << endl;
exit(-1);
}
return r;
}
//计算
Status Operate(SElemType a, SElemType theta, SElemType b) {
char n = char(theta); //强制转换成char型
switch (n)
{
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
default: if (b != 0) return a / b;
else
{
cout << "error!除数不能为0!" << endl;
exit(-1);
}
}
return OK;
}
//表达式求值
Status EvaluateExpression() {//算术表达式求值的算符优先算法,设OPTR和OPND分别为运算符栈和操作数栈
SqStack OPTR, OPND;
InitStack(OPND); //初始化OPND栈
InitStack(OPTR); //初始化OPTR栈
cout << "请输入这个算数表达式:(输入“#”代表结束)" << endl;
char ch;
SElemType a, b,theta,x,s;
Push(OPTR, '#'); //将表达式起始符“#”压入OPTR栈
cin >> ch;
while (ch != '#' || (GetTop(OPTR) != '#')) //表达式没有扫描完毕或OPTR的栈顶元素不为“#”
{
if (!In(ch)) {
s = ch - 48;
cin >> ch;
while (!In(ch))
{
s = s * 10 + ch- 48;
cin >> ch;
}
Push(OPND, s);
} //ch不是运算符则进OPND栈
else
switch (Precede(GetTop(OPTR), ch)) //比较OPTR的栈顶元素和ch的优先级
{
case '<':
Push(OPTR, ch);
cin >> ch; //当前字符ch压入OPTR栈,读入下一字符ch
break;
case '>':
Pop(OPTR, theta); //弹出OPTR栈顶的运算符
Pop(OPND, b);
Pop(OPND, a); //弹出OPND栈顶的两个运算数
Push(OPND, Operate(a, theta, b)); //将运算结果压入OPND栈
break;
case '=': //OPTR的栈顶元素是“(”且ch是“)”
Pop(OPTR, x);
cin >> ch; //弹出OPTR栈顶的“(”,读入下一字符ch
break;
} //switch
} //while
return GetTop(OPND); //OPND栈顶元素即为表达式求值结果
}
Status main()
{
cout << "计算结果为" << EvaluateExpression()<< endl;
system("pause");
}
运行结果