主要功能:
- 中缀表达式转换为后缀表达式
- 中缀表达式的计算
- 后缀表达式的计算
源码:
# include
# include
using namespace std;
# define MAXSIZE 100
void menu(){
cout<<" ------------------------------------------------------"<>a;
for(i=0;a[i]!='@';i++){
if(a[i]>='0'&&a[i]<='9'){//如果是数字直接入队
EnQueue(Q,a[i]);
}
else{//如果是符号进行以下判断
if(a[i]=='('){//如果是(直接入栈
Push(S,a[i]);
}
else if(a[i]==')'){//如果是右括号将栈中压在左括号上的元素依次入队并弹出栈
do{
EnQueue(Q,GetTop(S));
Pop(S,ch);
}while(GetTop(S)!='(');
Pop(S,ch);//将左括号弹出
}
else{
while(YouXianJi(a[i])<=YouXianJi(GetTop(S))){//如果读到的运算符优先级比栈顶元素的小,则将栈顶元素入队后弹出栈
EnQueue(Q,GetTop(S));
Pop(S,ch);
}
if(YouXianJi(a[i])>YouXianJi(GetTop(S))){//如果相反,则直接压入运算符栈
Push(S,a[i]);
}
}
}
}
while(GetTop(S)!='#'){//读到#说明到栈底了,将栈中的元素依次入队弹出
EnQueue(Q,GetTop(S));
Pop(S,ch);
}
Pop(S,ch);//将#也弹出
}
//-----------------------------------------------------------------------------------------------------------------------
int ZhuanHuan(char ch){ //将字符型转换成整形
switch(ch){
case '1':return 1;break;
case '2':return 2;break;
case '3':return 3;break;
case '4':return 4;break;
case '5':return 5;break;
case '6':return 6;break;
case '7':return 7;break;
case '8':return 8;break;
case '9':return 9;break;
case '0':return 0;break;
}
}
int JS(int m,int n,char ch){ //计算表达式
if(ch=='+'){
return m+n;
}
if(ch=='-'){
return m-n;
}
if(ch=='*'){
return m*n;
}
if(ch=='/'){
return m/n;
}
}
int HouJiSuan(Stack &S,SqQueue &Q){ //后缀表达式计算
int m,n,p,k,l;
char ch;
while(Q.front!=Q.rear){//如果队列不空依次读取队列中的元素
ch = GetHead(Q);
if(ch>='0'&&ch<='9'){//如果队列中的是数字则将字符栈中字符转换成数字在压入操作数栈中
k = ZhuanHuan(ch);
Push(S,k);
}
else{//如果读到字符,则在栈中弹出两个数赋值给m和n,计算将结果存入操作数栈中
m = GetTop(S);
Pop(S);
n = GetTop(S);
Pop(S);
p = JS(n,m,ch);
Push(S,p);
}
DeQueue(Q,ch);//出队
}
return p;
}
//---------------------------------------------------------------------------------------------------------
typedef struct //定义操作数栈的结构体
{
float *base;//可以存入浮点型数据
float *top;
int stacksize;
}ShuStack;
int InitShuStack(ShuStack &s)//操作数栈初始化
{
s.base = new float[MAXSIZE];
if(!s.base)
return 0;
s.top = s.base;
s.stacksize = MAXSIZE;
return 1;
}
void Push(ShuStack &s,float e)//操作数入栈
{
if(s.base-s.top==s.stacksize)
cout<<"栈满"<='0'&&x<='9')||x=='.')
return 1;
return 0;
}
char Precede(char c1,char c2){// 比较两个操作符的优先级
if(c1=='+')
{
if(c2=='+') return '>';
else if(c2=='-') return '>';
else if(c2=='*') return '<';
else if(c2=='/') return '<';
else if(c2=='(') return '<';
else if(c2==')') return '>';
else return '>';
}
else if(c1=='-')
{
if(c2=='+') return '>';
else if(c2=='-') return '>';
else if(c2=='*') return '<';
else if(c2=='/') return '<';
else if(c2=='(') return '<';
else if(c2==')') return '>';
else return '>';
}
else if(c1=='*')
{
if(c2=='+') return '>';
else if(c2=='-') return '>';
else if(c2=='*') return '>';
else if(c2=='/') return '>';
else if(c2=='(') return '<';
else if(c2==')') return '>';
else return '>';
}
else if(c1=='/')
{
if(c2=='+') return '>';
else if(c2=='-') return '>';
else if(c2=='*') return '>';
else if(c2=='/') return '>';
else if(c2=='(') return '<';
else if(c2==')') return '>';
else return '>';
}
else if(c1=='(')
{
if(c2=='+') return '<';
else if(c2=='-') return '<';
else if(c2=='*') return '<';
else if(c2=='/') return '<';
else if(c2=='(') return '<';
else return '=';
}
else if(c1==')')
{
if(c2=='+') return '>';
else if(c2=='-') return '>';
else if(c2=='*') return '>';
else if(c2=='/') return '>';
else if(c2==')') return '>';
else return '>';
}
else
{
if(c2=='+') return '<';
else if(c2=='-') return '<';
else if(c2=='*') return '<';
else if(c2=='/') return '<';
else if(c2=='(') return '<';
else return '=';
}
}
float JS1(float m,float n,char ch){ //计算表达式
if(ch=='+'){
return m+n;
}
if(ch=='-'){
return m-n;
}
if(ch=='*'){
return m*n;
}
if(ch=='/'){
return m/n;
}
}
void ZhongJiSuan(ShuStack &S,FuStack &S1){
char chuan[MAXSIZE];//用于输入表达式
char LinShi[MAXSIZE];
int i=0;
float f,e1,e2,e3;
int j=0;
char ch,ch1;
cout<<"请输入中缀表达式"<>chuan;
FuPush(S1,'#');//将#压入运算符栈中
while(chuan[i]!='#'||FuGetTop(S1)!='#'){//如果表达式没读完或运算符栈还有元素执行循环体
if((chuan[i]>='0'&&chuan[i]<='9')||chuan[i]=='.'||((chuan[i]=='-')&&(chuan[i-1]<'0'||chuan[i-1]>'9')&&(chuan[i-1]!=')')))//如果是数字
{
while((chuan[i]>='0'&&chuan[i]<='9')||chuan[i]=='.'||((chuan[i]=='-')&&(chuan[i-1]<'0'||chuan[i-1]>'9')&&(chuan[i-1]!=')')))
{
LinShi[j]=chuan[i];//将数存到临时数组里
i++;
j++;
}
LinShi[j]=' ';
f = atof(LinShi);//调用库函数将临时数组中的数据转换成浮点数
Push(S,f);//将数据压入运算数栈
j = 0;//将临时存放数据的数组清空用于第二次转换
}
else{
if(Precede(FuGetTop(S1),chuan[i])=='<'){//如果读到的符号比符号栈栈顶元素优先级高则将其压入符号栈
FuPush(S1,chuan[i]);
i++;
}
else if(Precede(FuGetTop(S1),chuan[i])=='>'){//如果读到的符号比符号栈栈顶元素优先级低则弹出操作数栈中的两个数计算完后压入运算数栈
ch1 = FuGetTop(S1);
FuPop(S1);
e1 = GetTop(S);
Pop(S);
e2 = GetTop(S);
Pop(S);
e3 = JS1(e2,e1,ch1);
Push(S,e3);
}
else{//如果优先级相等则弹出运算符
FuPop(S1);
i++;
}
}
}
cout<<"运算结果是"<>n;
if(n==1){
ZhongZhuanHou(S,Q);
for(i=Q.front;i!=Q.rear;i++){
cout<