主要功能:利用栈将中缀表达式转换成后缀表达式、并对后缀表达式求值。
#include<iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define Maxsize 50
typedef char Elemtype;
typedef struct
{
Elemtype data[Maxsize];
int top;
}SqStack;
typedef struct
{
double data[Maxsize];
int top;
}SqStack1;
void InitStack(SqStack *&s)
{
s = (SqStack *)malloc(sizeof(SqStack));
s->top = -1;
}//初始化栈1
void InitStack1(SqStack1 *&s)
{
s = (SqStack1 *)malloc(sizeof(SqStack1));
s->top = -1;
}//初始化栈2
void DestoryStack(SqStack *&s)
{
free(s);
}//销毁栈1
void DestoryStack1(SqStack1 *&s)
{
free(s);
}//销毁栈2
bool StackEmpty(SqStack *s)
{
return(s->top == -1);
}//判断栈是否为空
bool Push(SqStack *&s, Elemtype e)
{
if (s->top == Maxsize - 1)
return false;
s->top++;
s->data[s->top] = e;
return true;
}//进栈1
bool Push1(SqStack1 *&s,double e)
{
if (s->top == Maxsize - 1)
return false;
s->top++;
s->data[s->top] = e;
return true;
}//进栈2
bool Pop(SqStack *&s, Elemtype &e)
{
if (s->top == -1)
return false;
e = s->data[s->top];
s->top--;
return true;
}//出栈1
bool Pop1(SqStack1 * & s, double &e)
{
if (s->top == -1)
return false;
e = s->data[s->top];
s->top--;
return true;
}//出栈2
bool GetTop(SqStack *s, Elemtype &e)
{
if (s->top == -1)
return false;
e = s->data[s->top];
return true;
}//取栈1顶
bool GetTop1(SqStack1 *s, double &e)
{
if (s->top == -1)
return false;
e = s->data[s->top];
return true;
}//取栈2顶
//判断括号是否配对
bool Match(char exp[],int n)
{
int i=0; char e;
bool match=true;
SqStack *st;
InitStack(st); //初始化栈
while (i<n && match) //扫描exp中所有字符
{
if (exp[i]=='(') //当前字符为左括号,将其进栈
Push(st,exp[i]);
else if (exp[i]==')') //当前字符为右括号
{
if (GetTop(st,e)==true)
{
if (e!='(') //栈顶元素不为'('时表示不匹配
match=false;
else
Pop(st,e); //将栈顶元素出栈
}
else match=false; //无法取栈顶元素时表示不匹配
}
i++; //继续处理其他字符
}
if (!StackEmpty(st)) //栈不空时表示不匹配
match=false;
DestoryStack(st); //销毁栈
return match;
}
//中缀转后缀
void trans(char *exp,char postexp[])
{
char e;
SqStack *Optr; //定义运算符栈指针
InitStack(Optr);//初始化运算符栈
int i=0;// i作为postexp的下标
while(*exp!='\0') //判断是否扫描完成
{
switch(*exp)
{
case '(': //判定为左括号
Push(Optr,'(');//左括号进栈
exp++;//继续扫描其他字符
break;
case ')': //判定是否为右括号
Pop(Optr,e); //出栈
while(e!='(') //不为e时循环
{
postexp[i++]=e; //把e存到postexp中
Pop(Optr,e); //继续出栈e;
}
exp++; //继续扫描其他字符
break;
case '+':
case '-':
while(!StackEmpty(Optr)) //栈不为空时循环
{
GetTop(Optr,e); //取栈顶元素
if(e!='(')
{
postexp[i++]=e; //将e存到postexp中
Pop(Optr,e); //出栈元素e;
}
else
break;
}
Push(Optr,*exp);//将+或者-进栈
exp++;//继续扫描其他字符
break;
case '*':
case '/':
while(!StackEmpty(Optr)) //栈不为空时循环
{
GetTop(Optr,e); //取栈顶元素e
if(e=='*'||e=='/') //将栈顶元素e出栈并存在postexp中
{
postexp[i++]=e;//将e存放在postexp中
Pop(Optr,e);//出栈元素
}
else
break;//遇到非*或者非/的元素退出循环
}
Push(Optr,*exp);//将*或者/进栈
exp++;//继续扫描其他字符
break;
default: //处理数字字符
while(*exp>='0'&& *exp<='9') //判定是否为字符
{
postexp[i++]=*exp;
exp++;
}
postexp[i++]='#';//用#标记数字结束
}
}
while(!StackEmpty(Optr))//exp扫描结束,栈不为空时循环
{
Pop(Optr,e);//元素e出栈
postexp[i++]=e;//将e存到postexp中
}
postexp[i]='\0';//给postexp表达式添加结束标志
DestoryStack(Optr);//销毁栈
}
//计算后缀表达式的值
//计算后缀表达式的值
double compvalue(char *postexp)
{
double d,a,b,c,e;
SqStack1 *Opnd; //定义操作数栈
InitStack1(Opnd); //初始化操作数栈
while(*postexp!='\0')
{
switch(*postexp)
{
case '+'://判定为+号
Pop1(Opnd,a);//出栈元素a
Pop1(Opnd,b);//出栈元素b
c=b+a;//计算c
Push1(Opnd,c);//计算结果c进栈
break;
case '-'://判定为-号
Pop1(Opnd,a);//出栈元素a
Pop1(Opnd,b);//出栈元素b
c=b-a;//计算c
Push1(Opnd,c);//计算结果c进栈
break;
case '*'://判定为*号
Pop1(Opnd,a);//出栈元素a
Pop1(Opnd,b);//出栈元素b
c=b*a;//计算c
Push1(Opnd,c);//计算结果c进栈
break;
case '/'://判定为+号
Pop1(Opnd,a);//出栈元素a
Pop1(Opnd,b);//出栈元素b
if(a!=0)
{
c=b/a;//计算c
Push1(Opnd,c);//计算结果c进栈
// cout<<c<<endl;
break;
}
else
{
cout<<"除零错误"<<endl;
exit(0);//异常退出
}
break;
default://处理数字字符
d=0;
while(*postexp>='0'&& *postexp<='9')//判定是否为数字字符
{
d=10*d+*postexp-'0';
postexp++;
}
Push1(Opnd,d);//计算结果d进栈
break;
}
postexp++;//继续处理其他字符
}
GetTop1(Opnd,e);//取栈顶元素e
DestoryStack1(Opnd);
return e;
}
int main()
{
double n;
int k;
system("color 00a");
int m;//m为字符串长度
// char exp[]="(56-20)";
// char exp[]="(56-20)/(4+2)";
char postexp[100];
cout<<"请输入你的表达式"<<endl;
// cin>>m;
// cout<<"输入表达式"<<endl;
char exp[100];
cin.getline(exp, 14);
cout<<"输入表达式成功"<<endl;
cout<<"输入【0】程序退出"<<endl;
cout<<"输入【1】判断表达式是否配对"<<endl;
cout<<"输入【2】计算后缀表达式"<<endl;
cout<<"输入【3】输出计算结果"<<endl;
cout<<"请输入你的操作"<<endl;
cin>>k;
while(k!=0)
{
if(k==0)
{
cout<<"即将退出程序"<<endl;
break;
}
else if(k==1)
{
if (Match(exp,strlen(exp))==1)
cout<<"表达式括号配对,请继续其他操作"<<endl;
else
{
cout<<"表达式括号不配对"<<endl;
cout<<"程序退出"<<endl;
break;
}
}
else if(k==2)
{
trans(exp,postexp);
cout<<"后缀表达式为"<<postexp<<endl;
}
else if(k==3)
{
cout<<"计算的结果为:"<<compvalue(postexp)<<endl;
}
cout<<"请输入你的操作"<<endl;
cin>>k;
}
}
//(56-20)/(4+2)