除括号外,栈中一直保持两个符号
都是现将数字前的符号入栈,然后打印符号后面的数字,然后判断符号是否出栈

#include <stdio.h> #include <ctype.h> #include <stdlib.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 #define MAXBUFFER 10 typedef double ElemType; typedef struct { ElemType *base; ElemType *top; int stackSize; }sqStack; void InitStack(sqStack *s){ s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if(!s->base) exit(0); s->top = s->base; s->stackSize = STACK_INIT_SIZE; // return s; } void Push(sqStack *s, ElemType e){ if(s->top - s->base >= s->stackSize){ s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT)*sizeof(ElemType)); if(!s->base) exit(0); s->top = s->base + s->stackSize; s->stackSize = s->stackSize + STACKINCREMENT; } *(s->top) = e; s->top++; // return s; } void Pop(sqStack *s, ElemType *e){ if(s->top == s->base) return; *e = *--(s->top); } int StackLen(sqStack s){ return (s.top - s.base);
}
int main(){ sqStack s; char c,e; InitStack(&s); printf("请输入中缀表达式,以#作为结束标志"); scanf("%c",&c); while(c != '#'){ while(c>='0'&&c<='9'){ printf("%c",&c); //处理连续数据 scanf("%c",&c); //如果输入超出0到9范围,下次将不再进入while语句 if(c<'0'||c>'9') printf(" "); } if(')' == c) { Pop(&s, &e); while ('(' != e) { printf("%c ", e);//有空格,分割不同数据 Pop(&s, &e); } } else if('+' == c || '-' == c){ if(!StackLen(s)) Push(&s,c); else{ do { Pop(&s, &e); if ('(' == e) Push(&s, e); else { printf("%c ", e); } } while(StackLen(s) && '(' != e); Push(&s,c); } } else if('*' == c || '/' == c || '(' == c){ Push(&s,c); } else if('#' == c) //之前的限制被被0-9的语句解开,此处需要再次进行限制 break; else{ printf("出错,输入错误\n"); return -1; } scanf("%c",&c); } while(StackLen(s)){ Pop(&s,&e); printf("%c ",e); //输入完毕后如果栈内还有运算符,则直接弹出 } }