user-0 提问: 栈的应用——表达式计算

回复:
user: user-1
content: 这是我之前写过的一道类似的题目，代码供你参考一下  /********************************************************* #include<malloc.h> #include<stdio.h> #define OK 1 #define ERROR 0 #define STACK_INIT_SIZE 100 // 存储空间初始分配量 #define STACKINCREMENT 10 // 存储空间分配增量  typedef char SElemType; // 定义栈元素类型 typedef int Status; // Status是函数的类型,其值是函数结果状态代码，如OK等 typedef int ElemType; struct SqStack {      SElemType *base; // 在栈构造之前和销毁之后，base的值为NULL      SElemType *top; // 栈顶指针      int stacksize; // 当前已分配的存储空间，以元素为单位 }; // 顺序栈  Status InitStack(SqStack &S) { // 构造一个空栈S，该栈预定义大小为STACK_INIT_SIZE 	S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));      if(!S.base) return ERROR; 	 S.top=S.base; 	 S.stacksize=STACK_INIT_SIZE; 	 return OK; }  Status Push(SqStack &S,SElemType e) { // 在栈S中插入元素e为新的栈顶元素 	if(S.top-S.base>=S.stacksize) 	{ 		S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); 		if(!S.base) return ERROR; 		S.top=S.base+S.stacksize; 		S.stacksize+=STACKINCREMENT; 	} 	*S.top++=e; 	return OK; }  Status Pop(SqStack &S,SElemType &e) { // 若栈不空，则删除S的栈顶元素，用e返回其值，并返回OK；否则返回ERROR 	if(S.top==S.base) return ERROR;      e=*--S.top; 	 return OK; }  Status GetTop(SqStack S,SElemType &e) { // 若栈不空，则用e返回S的栈顶元素，并返回OK；否则返回ERROR 	if(S.top==S.base) return ERROR;     e=*(S.top-1); 	return OK; }  struct SqStack2 {      ElemType *base; // 在栈构造之前和销毁之后，base的值为NULL      ElemType *top; // 栈顶指针      int stacksize; // 当前已分配的存储空间，以元素为单位 }; // 顺序栈  Status InitStack2(SqStack2 &S) { // 构造一个空栈S，该栈预定义大小为STACK_INIT_SIZE 	S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));      if(!S.base) return ERROR; 	 S.top=S.base; 	 S.stacksize=STACK_INIT_SIZE; 	 return OK; }  Status Push2(SqStack2 &S,ElemType e) { // 在栈S中插入元素e为新的栈顶元素 	if(S.top-S.base>=S.stacksize) 	{ 		S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType)); 		if(!S.base) return ERROR; 		S.top=S.base+S.stacksize; 		S.stacksize+=STACKINCREMENT; 	} 	*S.top++=e; 	return OK; }  Status Pop2(SqStack2 &S,ElemType &e) { // 若栈不空，则删除S的栈顶元素，用e返回其值，并返回OK；否则返回ERROR 	if(S.top==S.base) return ERROR;      e=*--S.top; 	 return OK; }  Status GetTop2(SqStack2 S,ElemType &e) { // 若栈不空，则用e返回S的栈顶元素，并返回OK；否则返回ERROR 	if(S.top==S.base) return ERROR;     e=*(S.top-1); 	return OK; }  char Precede(char a,char c) {     int i,j;     char pre[7][7]={         {'>','>','<','<','<','>','>'},         {'>','>','<','<','<','>','>'},         {'>','>','>','>','<','>','>'},         {'>','>','>','>','<','>','>'},         {'<','<','<','<','<','=','0'},         {'>','>','>','>','0','>','>'},         {'<','<','<','<','<','0','='}     };     switch(a){     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;         return 0;     }     switch(c){     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;         return 0;     }     return pre[i][j]; }  SElemType Operate(int a,char b,int c) {     int result;      switch(b)     {     case '+':result=a+b;break;     case '-':result=a-b;break;     case '*':result=a*b;break;     case '/':result=a/b;break;     }     return result; }  int In(char c) {     switch(c)     {     case '+':     case '-':     case '*':     case '/':     case '(':     case ')':     case '=':         return 1;     }     return 0; }  SElemType Evaluate() {     struct SqStack  OPTR;     struct SqStack2 OPND;     char c,x,e,theta;     int a,b,result;     InitStack(OPTR);     Push(OPTR,'#');     InitStack2(OPND);     c=getchar();     while(c!='='||GetTop(OPTR,e),e!='=')     {         if(!In(c))         {             b=1;a=0;             while(!In(c))             {                 a=a*b+c-'0';                 b*=10;                 c=getchar();             }             Push2(OPND,a);         }         else switch(Precede(e,c))             {             case '<':                 Push(OPTR,c);                 c=getchar();                 break;             case '=':                 Pop(OPTR,x);                 c=getchar();                 break;             case '>':                 Pop(OPTR,theta);                 Pop2(OPND,a);                 Pop2(OPND,b);                 Push2(OPND,Operate(a,theta,b));                 break;             }      }     GetTop2(OPND,result);     return result; }  int main() {     printf("%d",Evaluate());     return 0; }    *********************************************/ #include<malloc.h> #include<stdio.h> #define STACK_INIT_SIZE 100 // 存储空间初始分配量 #define STACKINCREMENT 10 // 存储空间分配增量  typedef int SElemType; // 定义栈元素类型 typedef int Status; // Status是函数的类型,其值是函数结果状态代码，如OK等  struct SqStack {      SElemType *base; // 在栈构造之前和销毁之后，base的值为NULL      SElemType *top; // 栈顶指针      int stacksize; // 当前已分配的存储空间，以元素为单位 }; // 顺序栈  Status InitStack(SqStack &S) { // 构造一个空栈S，该栈预定义大小为STACK_INIT_SIZE 	S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));      if(!S.base) return 0; 	 S.top=S.base; 	 S.stacksize=STACK_INIT_SIZE; 	 return 1; }  Status Push(SqStack &S,SElemType e) { // 在栈S中插入元素e为新的栈顶元素 	if(S.top-S.base>=S.stacksize) 	{ 		S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); 		if(!S.base) return 0; 		S.top=S.base+S.stacksize; 		S.stacksize+=STACKINCREMENT; 	} 	*S.top++=e; 	return e; }  Status Pop(SqStack &S,SElemType &e) { // 若栈不空，则删除S的栈顶元素，用e返回其值，并返回OK；否则返回ERROR 	if(S.top==S.base) return 0;      e=*--S.top; 	 return e; }  Status GetTop(SqStack S,SElemType &e) { // 若栈不空，则用e返回S的栈顶元素，并返回OK；否则返回ERROR 	if(S.top==S.base) return 0;     e=*(S.top-1); 	return e; }   int precede(char a,char b) {     if(a=='+'||a=='-'){if(b=='+'||b=='-'||b==')'||b=='=')return '>';else return '<';}     else if(a=='*'||a=='/'){if(b=='(')return '<';else return '>';}     else if(a=='('){if(b==')')return '=';else return '<';}     else if(a==')'){return '>';}     else if(a=='='){if(b=='=')return '=';else return '<';}     return 0; } int P() {     char c;int x,b,d,e,s;     SqStack T,N;     InitStack(T);InitStack(N);     Push(T,'=');c=getchar();     while(c!='='||GetTop(T,e)!='=')     {         if(c!='+'&&c!='-'&&c!='*'&&c!='/'&&c!='='&&c!='('&&c!=')'){s=c-'0';c=getchar();while(c>='0'&&c<='9'){s=s*10+(c-'0');c=getchar();}Push(N,s);}         else         switch (precede(GetTop(T,e),c))         {             case '<':Push(T,c);c=getchar();break;             case '=':Pop(T,x);c=getchar();break;             case '>':Pop(T,e);Pop(N,b);Pop(N,d);             if(e=='+')Push(N,d+b);             else if(e=='-')Push(N,d-b);             else if(e=='*')Push(N,d*b);             else if(e=='/')Push(N,d/b);             break;         }      }     return GetTop(N,e); } int main() {     printf("%d",P());     return 0; }

user: user-1
content: 首先，你要把这些代码放在cpp文件里，其次，main第五行有一个gets_s(a);这里要去掉_s，运算过程中最后得到的数并不一定只有一位，所以最后那里输出的时候也错了，可能你中间的计算也有一点问题，导致我改后试了一下你的1+1得到的是-48