栈的实例—中缀表达式转化后缀表达式
思路:
考虑括号和优先级
/*
1.如果是数字,直接打印
2.如果是右括号,弹出并打印,直到出现左括号只弹出
3.如果是+,-,栈空直接入栈,否则,依次弹出打印直到遇到左括号
4.如果是*,/,(,直接入栈。
*/
/* 1.如果是数字,直接打印 2.如果是右括号,弹出并打印,直到出现左括号只弹出 3.如果是+,-,栈空直接入栈,否则,依次弹出打印直到遇到左括号 4.如果是*,/,(,直接入栈。 */ //中缀表达式转换成后缀表达式 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define STACK_INIT_SIZE 20 //存储栈的长度,栈大小 #define STACKINCREMENT 10 //当栈空间不够时,每次增加的幅度 #define MAXBUFFER 10 typedef char 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; } //压栈操作 void Push(sqStack *s,ElemType e) { if(s->top-s->base>=s->stackSize) { //为s->base指针指向的内存块 重新分配内存 s->base=(ElemType *)realloc(s->base,(s->stackSize+STACKINCREMENT) * sizeof(ElemType)); //若为空,则分配失败 if(!s->base) { exit(0); } } *(s->top) = e; //把数据e压入栈顶指针指向的地址 s->top++; } //出栈操作 void Pop(sqStack *s,ElemType *e) { if(s->top==s->base) { return; } *e = *--(s->top); //先减再把值赋给e } int StackLen(sqStack s) { return (s.top - s.base); } int main() { char c; char e; sqStack s; int i = 0; InitStack(&s); printf("请输入中缀表达式,以#作为结束标志:\n"); scanf("%c",&c); while(c!='#') { //i用于调试,因为结果不对,一直是只出现第一组数,就啥也没了 //原因:竟然是scanf("%c", &c);里写成了单引号 //printf("%d",i++); while(c>='0' && c<='9') { printf("%c", c); scanf("%c", &c); if(c<'0' || c>'9') { printf(" "); } } // while(isdigit(c) || c=='.') // { // printf("%c", c); // scanf("%c", &c); // if(! isdigit(c)) // { // printf(' '); // } // } if(')'==c) { Pop(&s, &e); while('('!=e) { printf("%c ", e); Pop(&s, &e); } } else if('+'==c || '-'==c) { if(!StackLen(s)) { printf("vds"); 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) { break; } else { printf("\n出错:输入格式错误!\n"); return -1; } scanf("%c", &c); } while(StackLen(s)) { Pop(&s, &e); printf("%c ", e); } return 0; }
遇到的问题:
//i用于调试,因为结果不对,一直是只出现第一组数,就啥也没了
输入12+3# 结果:12 没了!!!!
//原因:竟然是scanf("%c", &c);里写成了单引号