5. 栈的应用
#include
#define stack_init_size 500 //栈的存储结构 #define stackincrement 100 typedef struct Stack{ char *base; char *top;
int stacksize; }Stack;
void Push(Stack &S,char e); void Init(Stack &S);
void Destroy(Stack &S);
char GetTop(Stack S,char &e); char Pop(Stack &S, char &e);
char operation(Stack s1,Stack s2); int suanfu(char c);
char Precede(char x,char y);
char Operate(char x,char z,char y);
void Init(Stack &S) {
S.base=new char[500];
if(!S.base) abort(); S.top=S.base;
S.stacksize=stack_init_size; }
void Destroy(Stack &S) {
int i;
i=S.top-S.base; for(;i<0;i--)
{ delete --S.top; //删除的必须是指针 }
delete S.top; delete[] S.base; }
char GetTop(Stack S,char &e) {
if(S.top==S.base) abort(); e=*--S.top; return e; }
char Pop(Stack &S, char &e) {
if(S.top==S.base) abort(); e=*--S.top; return e; }
void Push(Stack &S,char e) {
if(S.top-S.base>=S.stacksize)// the stack is full filled { S.base=(char
*)realloc(S.base,(S.stacksize+stackincrement)*sizeof(char));
if(!S.base) abort(); S.top=S.stacksize+S.base; S.stacksize=S.stacksize+stackincrement; } *S.top++=e; }
int suanfu(char c) {
if(c=='*')return 1;
else if(c=='/')return 1; else if(c=='-')return 1; else if(c=='+')return 1; else if(c=='(')return 1;
else if(c==')')return 1; else if(c=='#')return 1;
else return 0; }
char Precede(char x,char y){ int i,j; int
form[7][7]={{1,1,-1,-1,-1,1,1},{1,1,-1,-1,-1,1,1},{1,1,1,1,-1,1,1},{1,1,1,1,-1,1,1},{-1,-1,-1,-1,-1,0,2},{1,1,1,1,2,1,1},{-1,-1,-1,-1,-1,2,0}};
switch(x){
case '+':i=0;break; case '-':i=1;break; case '*':i=2;break; case '/':i=3;break; case '(':i=4;break; case ')':i=5;break; case '#':i=6;break; }
switch(y){
case '+':j=0;break; case '-':j=1;break; case '*':j=2;break; case '/':j=3;break; case '(':j=4;break; case ')':j=5;break; case '#':j=6;break; }
if(form[i][j]==1) return '>';
else if(form[i][j]==-1) return '<'; else
return '='; }
char Operate(char x,char z,char y) {
int a=x-'0',b=y-'0';
switch(z){
case '+':return a+b; case '-':return a-b; case '*':return a*b; case '/':return a/b; } }
char operation(Stack s1,Stack s2) //s1 为运算符 栈;s2为 运算数栈;
{
Init(s1); Push(s1,'#');
Init(s2);
cout<<\请输入算式:\ char c; cin>>c;
char e; char l;char q;char u1; while(c!='#'||GetTop(s1,e)!='#') { if(!suanfu(c)) //判断是否为运算符 { Push(s2,c); cin>>c; } else
u1=Precede(GetTop(s1,l),c); switch(Precede(GetTop(s1,l),c)) {
case '<':{Push(s1,c);cin>>c;break;} case'=':{Pop(s1,q);cin>>c;break;} case'>':
{char v;char y,d; Pop(s1,v); Pop(s2,y); Pop(s2,d);
int a1=Operate(d,v,y); //知道了是在这里出现的错误。第一次计算出的值在存到s2里时,类型出了问题
//存储的时候在后面加了一个?,让出来的数字变了大小
Push(s2,a1+0x30);//整形变字符型 在整形数上加0x30就可以了
break;} } }
char r;
return GetTop(s2,r); }
void main() {
Stack s1,s2; int u;
u=operation(s1,s2); cout<<(char)u< 6. 实验结果