顺序栈

来源:互联网 发布:windows防火墙允许ip 编辑:程序博客网 时间:2024/04/27 23:49
#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);}
0 0
原创粉丝点击