📄
字号:
#include "SqStack.h"
//栈的抽象数据类型
int main()
{//简单表达式的求值,这个表达式只有3类字符,即阿拉伯数值,括号,运算符(+,-,*)
SqStack CS; //calculation symbol,运算符栈
SqStack DT; //data,操作数栈
InitStack(CS);
InitStack(DT); //栈的初始化
char c; //c表示表达式的当前结点
int i=0,cc,e,d1,d2,r; //i是表达式数组的下标,其它变量具体请看程序。
bool IsSymbol(char );
int Operate(int ,char ,int );
short precede(int ,int );
static char expression[60]; //表达式的输入
cout<<"请输入表达式,请不要忘了在表达式的最后加标记#"<<endl; //表达式输入,以#表示结束
cin>>expression; //注意用这种方法输入字符串时,输入的长度如果没有达到60,系统就默认用'\0'填充。
cout<<expression<<endl;
c=expression[i];Push(CS,'#');
while(c!='\0'){ // 标记:while1
int first=1; //用于记录c是否是连续出现的第一个数字字符
while(!IsSymbol(c)){ //标记:while2
cc=c-'0';
if(first==1) { //如果是连续出现的第一个数字字符,则直接入栈DT。
Push(DT,cc);
cout<<cc<<" 入数据栈"<<endl;
first++;
}//if
else{ //如果不是连续数字字符的第一个
first++;
Pop(DT,e);
cout<<e<<" 出数据栈"<<endl;
cc=e*10+cc; //求值
Push(DT,cc);
cout<<cc<<" 入数据栈"<<endl;
}//else
i++;
c=expression[i];
}//while2
cout<<endl;
cout<<"c 为 "<<c<<endl;
if(!GetTop(CS,e)){ //有错误
cout<<"表达式有错误2"<<endl;
return ERROR;
}//if
cout<<"运算符栈顶 "<<char(e)<<endl;
switch(precede(e,int(c))){
case 0: //c的优先权高
cout<<c<<"入运算符栈"<<endl<<endl;
Push(CS,int(c));i++;c=expression[i];
break;
case -1://c是右括号
Pop(CS,e);
cout<<char(e)<<"出运算符栈"<<endl;
i++;c=expression[i];
break;
case 1:
Pop(CS,e); cout<<char(e)<<" 出运算符栈"<<endl;
Pop(DT,d1);Pop(DT,d2);cout<<"d1为 "<<d1<<'\t'<<" d2为 "<<d2<<" d1,d2出数据栈"<<endl;
r=Operate(d2,char(e),d1); //计算"d2 e d1"的结果,注意d1,d2的顺序
Push(DT,r);
cout<<"d2 "<<char(e)<<"d1 "<<" = "<<r<<endl;cout<<r<<" 入数据栈"<<endl<<endl;
//将结果入栈
break;
default:
cout<<"表达式输入错误3"<<endl;return ERROR;
}//switch
}//while1
Pop(DT,e);
cout<<"表达式的结果为"<<e<<endl;
if(!StackEmpty(CS)&&!StackEmpty(DT)) { //最后两个栈必须为空,否则表明表达式输入错误
cout<<"表达式输入有错误4"<<endl;
return ERROR;
}//if
cout<<"谢谢使用!!^_^"<<endl;
return OK;
}//main
//子函数IsSymbol,若输入的参数是数字字符返回0,否则返回1;
bool IsSymbol(char r){
if(r>='0'&&r<='9') return 0;
else
return 1;
}//IsSymbol
//子函数Operate,做运算d1 e d2,其中e是运算符,d1,d2是操作数
int Operate(int d1,char e,int d2){
switch(e){
case '+':return d1+d2;
case '-':return d1-d2;
case '*':return d1*d2;
default: cout<<"表达式输入有错误5"<<endl;return ERROR;
}//switch
}//Operate
//子函数precede用来判断两个运算符的有限级.如果i比j优先,返回1; 反之返回0; -1表示i=(,j=)或者i=j=#;2表示表达式出错了。
short precede(int i,int j){
short precedence[6][6]={{1,1,0,0,1,1},{1,1,0,0,1,1},{1,1,1,0,1,1},{0,0,0,0,-1,2},{1,1,1,2,2,2},{0,0,0,0,2,-1}};
char c[2];
c[0]=char(i);c[1]=char(j); //对int类型的i,j强制类型转换成字符型
int ord[2]; //c1,c2符号在优先级数组中的序号,取值1,2,3,4,5,6.
for(short ii=0;ii<=1;ii++){
switch(c[ii]){
case '+': ord[ii]=0;break; //教训啊,总是那么深刻,查了好久才发现漏了break;
case '-': ord[ii]=1;break;
case '*': ord[ii]=2;break;
case '(': ord[ii]=3;break;
case ')': ord[ii]=4;break;
case '#': ord[ii]=5;break;
default: cout<<"表达式输入有错误6";return ERROR;
}//switch
}//for
return precedence[ord[0]][ord[1]]; //返回优先数
}//precede
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -