#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
typedef struct {
char *top;
char *base;
int stacksize;
}charstack;
typedef struct{
int *top;
int *base;
int stacksize;
}intstack;
void initchar(charstack &s);
int pushchar(charstack &s,char e);
int popchar(charstack &s,char &e);
int get_char(charstack s,char &e);
int empchar(charstack s);
void dischar(charstack s);
void initint(intstack &L);
int pushint(intstack &L,int e);
int popint(intstack &L,int &e);
int get_int(intstack L,int &e);
int empint(intstack L);
int tran(char e);
void disint(intstack L);
int prior(char a);
void trans(char exp[],char tran[]);
int calcu(char exp[]);
void initchar(charstack &s)
{
s.base=new char[100];
if(s.base==NULL){//printf("空间分配失败!\n");
exit(0);}
s.stacksize=100;
s.top=s.base;
}
int pushchar(charstack &s,char e)
{
if(s.top-s.base>=s.stacksize)
{//printf("字符栈满!按任意键继续!\n");
getch();return 0;}
*s.top++=e;
return 1;
}
int popchar(charstack &s,char &e)
{
if(s.base==s.top)
{//printf("栈空!按任意键继续!\n");
getch();return 0;}
e=*--s.top;
return 1;
}
int get_char(charstack s,char &e)
{
if(s.base==s.top)
{//printf("栈空!按任意键继续!\n");
getch();return 0;}
e=*(s.top-1);
return 1;
}
int empchar(charstack s)
{
if(s.base==s.top)
{//printf("栈空!");
return 1;}
else return 0;
}
void dischar(charstack s)
{
while(s.top!=s.base){
printf("%c",*(s.top-1));s.top--;
}printf("\n");
}
void initint(intstack &L)
{
L.base=new int[100];
if(L.base==NULL){//printf("空间分配失败!\n");
exit(0);}
L.stacksize=100;
L.top=L.base;
}
int pushint(intstack &L,int e)
{ if(L.top-L.base>=L.stacksize)
{//printf("栈满!按任意键继续!\n");
getch();return 0;}
*L.top++=e;
return 1;
}
int popint(intstack &L,int &e)
{
if(L.base==L.top)
{//printf("栈空!按任意键继续!\n");
getch();return 0;}
e=*--L.top;
return 1;
}
int get_int(intstack L,int &e)
{ if(L.base==L.top)
{//printf("栈空!按任意键继续!\n");
getch();return 0;}
e=*(L.top-1);
return 1;
}
int empint(intstack L)
{
if(L.base==L.top)
{//printf("栈空!");
return 1;}
else return 0;
}
int tran(char e)
{
return e-'0';
}
void disint(intstack L)
{
while(L.top!=L.base){
printf("%d",*(L.top-1));L.top--;
}printf("\n");
}
int prior(char a)
{
if(a=='#') return 1;
if(a=='(') return 2;
if(a=='+'||a=='-') return 3;
if(a=='*'||a=='/') return 4;
else return 0;
}
void trans(char exp[],char tran[])
{
int i=0,j=0,n=0;
charstack s;
char c;
while(exp[n]!='\0')n++;
exp[n]='#';
exp[n+1]='\0';
initchar(s);
pushchar(s,'#');
while(!empchar(s)){
if(exp[i]<='9'&&exp[i]>='0')
tran[j++]=exp[i];
else{
switch(exp[i]){
case '(':pushchar(s,'(');break;
case ')':popchar(s,c);
while(c!='('){tran[j++]=c;popchar(s,c);}
break;
default:
while(get_char(s,c)&&prior(c)>=prior(exp[i]))
{if(c!='#') tran[j++]=c;popchar(s,c);}
if(exp[i]!='#')pushchar(s,exp[i]);
}
printf("%c",tran[j]);
}
i++;
}tran[j]='\0';
}
int calcu(char exp[])
{
int t1,t2,t=0;
intstack L;
int i=0;
initint(L);
while(exp[i]!='\0')
{
if(exp[i]>='0'&&exp[i]<='9')
{
t=tran(exp[i]);
pushint(L,t);
}
if(exp[i]=='+'||exp[i]=='-'||exp[i]=='*'||exp[i]=='/')
{
popint(L,t2);
popint(L,t1);
switch(exp[i]){
case '+':t=t1+t2;pushint(L,t);break;
case '-':t=t1-t2;pushint(L,t);break;
case '*':t=t1*t2;pushint(L,t);break;
case '/':t=t1/t2;pushint(L,t);break;
}
}
i++;
}
popint(L,t);
return t;
}
void main()
{
char *a,*b;
a=new char[100];
b=new char[100];
int result;
printf("请输入你要输入的字符串:\n");
scanf("%s",a);
fflush(stdin);
trans(a,b);
printf("\n原表达式转化的后缀表达式为:%s",b);
result=calcu(b);
printf("\n\n计算结果:%d\n",result);
}
顺序栈
最新推荐文章于 2022-06-08 22:08:47 发布