栈与队列应用:逆波兰计算器(逆波兰表达式;后缀表达式)把运算符放到运算量后边 && 中缀表达式转化为后缀表达式
Posted zhenglijie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈与队列应用:逆波兰计算器(逆波兰表达式;后缀表达式)把运算符放到运算量后边 && 中缀表达式转化为后缀表达式相关的知识,希望对你有一定的参考价值。
1 //1.实现对逆波兰输入的表达式进行计算如(2-1)*(2+3)= 5 就输入2 1 - 2 3 + * //先把2 1 压栈 遇到-弹栈 再把2 3压进去 遇到+弹栈 最后遇到*弹栈 2 //2.支持带小数点的数据 3 例: 正常操作----->逆波兰表达式 4 a+b ------>a b + 5 a+(b-c)----->a b c - + 6 a+(b-c)*d--->a b c - d * + 7 a+d*(b-c)--->a d b c - * + 8 9 //2 5 + 4 2 - * == (2+5)*(4-2) == 14 10 //1 34 + 4 2 / * ==(1+34)*(4/2)== 70 11 #include<stdio.h> 12 #include<stdlib.h> 13 #include<ctype.h> //函数isdigit 检查是否为十进制数 14 15 #define MAXSIZE 100 16 #define MAXBUFFER 10 //缓冲区 17 18 typedef double ElemType; 19 20 typedef struct 21 { 22 ElemType *base; 23 ElemType *top; 24 int sizeStack; 25 }sqStack; 26 27 void InitStack(sqStack *s) 28 { 29 s->base = (ElemType *)malloc(MAXSIZE*sizeof(ElemType)); 30 if(!s->base) 31 { 32 exit(0); 33 } 34 s->top = s->base; 35 s->sizeStack = MAXSIZE; 36 } 37 38 void Push(sqStack *s,ElemType e) 39 { 40 if(s->top - s->base == s->sizeStack) 41 { 42 exit(0); 43 } 44 *(s->top) = e; 45 s->top++; 46 } 47 48 void Pop(sqStack *s,ElemType *e) 49 { 50 if(s->top == s->base) 51 { 52 return; 53 } 54 *e = *(--(s->top)); 55 } 56 57 int main(void) 58 { 59 sqStack s; 60 char c; 61 char str[MAXBUFFER]; 62 double d,e; 63 int i = 0; 64 65 InitStack(&s); 66 printf("请输入后缀表达式的字符,运算符与数字用空格隔开 "); 67 scanf("%c",&c); 68 while(c != ‘#‘) 69 { 70 while(isdigit(c) || c==‘.‘) //判断是否遇到数字 71 { 72 str[i++] = c; 73 str[i] = ‘