#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct {
char *data;
int top;
int stacksize;
}SqStack;
typedef struct {
int *data;
int top;
int stacksize;
}SqStackk;
//初始化
int InitStack(SqStack &s){
s.data=new char[STACK_INIT_SIZE];
if(!s.data)
exit(0);
s.top=-1;
s.stacksize=STACK_INIT_SIZE ;
return 1;//1表示成功
}
int InitStackk(SqStackk &s){
s.data=new int[STACK_INIT_SIZE];
if(!s.data)
exit(0);
s.top=-1;
s.stacksize=STACK_INIT_SIZE ;
return 1;//1表示成功
}
//进栈
int push(SqStack &s,char e)
{char *p;
if(s.top>=s.stacksize-1)
{//满了
p=(char*)realloc(s.data,(s.stacksize+STACKINCREMENT)*sizeof(char));
if(!p)
exit(0);
s.data=p;
s.stacksize=s.stacksize+STACKINCREMENT;
}
s.data[++s.top]=e;
return 1;//1表示成功
}
int pushh(SqStackk &s,int e)
{int *p;
if(s.top>=s.stacksize-1)
{//满了
p=(int*)realloc(s.data,(s.stacksize+STACKINCREMENT)*sizeof(int));
if(!p)
exit(0);
s.data=p;
s.stacksize=s.stacksize+STACKINCREMENT;
}
s.data[++s.top]=e;
return 1;//1表示成功
}
//出栈
int pop(SqStack &s,char &e)
{if(s.top==-1)
return 0;//0表示失败
e=s.data[s.top--];
return 1;//1表示成功
}
int popp(SqStackk &s,int &e)
{if(s.top==-1)
return 0;//0表示失败
e=s.data[s.top--];
return 1;//1表示成功
}
//取栈顶元素
char GetTop(SqStack s)
{if(s.top==-1)
return 0; //0表示错误
return s.data[s.top];
}
//判断栈是否为空栈
int StackEmpty(SqStack s)
{if(s.top==-1)
return 1;//1表示成功
return 0;//0表示失败
}
//运算符优先级
char Precede(char ch1,char ch2){
char op[]="+-*/()#";
char tab[7][8]={
">><<<>>",
">><<<>>",
">>>><>>",
">>>><>>",
"<<<<<=",
">>>> >>",
"<<<<<=",
};
for(int i=0;i<7;i++)if(op[i]==ch1)break;
for(int j=0;j<7;j++)if(op[j]==ch2)break;
return tab[i][j];
}
//把表达式转化为后缀表达式
void transform(char suffix[],char exp[])
{
SqStack top;
int i=0;
char ch;
InitStack(top);
push(top,'#');
while(*exp!='#')
if(*exp>='0' && *exp<='9')
{
do{
suffix[i++]=*exp;
exp++;
}
while(*exp>='0'&&*exp<='9');
suffix[i++]='$';
}
else{
switch(*exp)
{
case '(':push(top,*exp);break;
case ')':
pop(top,ch);
while(ch!='(') {suffix[i++]=ch;pop(top,ch);}
break;
default:
while(Precede(GetTop(top),*exp)!='<') {pop(top,ch);suffix[i++]=ch;}
push(top,*exp);
break;
}
exp++;
}
while(!StackEmpty(top)){pop(top,ch);suffix[i++]=ch;}
}
//后缀表达式求值法
int calcul_exp(char *suffix)
{ SqStackk topp;
int a,b,c,result,d;
InitStackk( topp);
while(*suffix!='#')
{
d=0;
if(*suffix>='0'&&*suffix<='9')
{
while(*suffix!='$')
{
d=10*d+*suffix-'0';
suffix++;
}
pushh(topp, d);
suffix++;
}
else{
popp(topp,b);popp(topp,a);
switch(*suffix){
case '+':c=a+b;break;
case '-':c=a-b;break;
case '*':c=a*b;break;
case '/':c=a/b;break;
}
pushh(topp,c);
suffix++;
}
}
popp(topp,result);
return result;
}
int main()
{
int i=0;
char suffix[100]={0};
char exp[100]={0};
gets(exp);
printf("\n");
transform(suffix, exp);
for(i=0;suffix[i]!='\0';i+=1)
{
if(suffix[i]=='$')
{
printf("%c",',');
i+=1;
}
printf("%c",suffix[i]);
}
int j;
j=calcul_exp(suffix);
printf("%d",j);
return 0;
}
利用栈将中缀表达式转换为后缀表达式并进行计算
最新推荐文章于 2023-07-11 08:45:00 发布