数据结构与算法笔记 lesson 12 中缀表达式转后缀表达式

来源:互联网 发布:java生成unix时间戳 编辑:程序博客网 时间:2024/05/20 06:23

中缀表达式

-(1-2)*(4+5)

后缀表达式

- 1 2 - 4 5 +  *


1+(2-3)*4+10/5

第一个输入是数字1 ,数字在后缀表达式中都是直接输出,接着是符号“+” ,入栈

第三个字符是“(”,依然是符号,入栈,接着是数字2 ,输出,然后是符号“-” ,入栈

接下来是数字3,输出, 紧跟着是“)”,去匹配栈里的“)”,进行计算

* 直接入栈,遇到4 ,输出之后是“+”,此时栈顶元素是符号“*” ,乘号优先级比加号大, *先出栈,进行计算,再把+入栈

紧接着数字10,输出,最后是符号“/”,进栈。


从左到右遍历中缀表达式的每个数字和符号,若是数字则直接输出,若是符号,则判断其与栈顶符号的优先级,是右括号或者优先级低于栈顶符号,则栈顶元素依次出栈并输出,直到遇到左括号或者栈空才将低优先级的符号入栈。

#include <stdio.h>#include<stdlib.h>#include<ctype.h>#include<math.h>#define STACK_INIT_SIZE 20#define STACKINCREMENT 10#define MAXBUFFER 10typedef 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 = (ElemType*)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));if (!s->base)exit(0);}*(s->top) = e;s->top++;}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("请输入要计算的算式,以#作为结束表示:\n");scanf("%c", &c);while (c!='#'){while (c >= '0' && c <= '9'){printf("%c", c);scanf("%c", &c);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);elseprintf("%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;}


0 0
原创粉丝点击