数据结构-------计算逆波兰表达式(后缀表达式)
2014-04-02 22:23
423 查看
一、计算后缀表达式
1、读入一个后缀表达式(逆波兰表达式)判断:
(1)如果是数字,直接压栈(注意要压栈的是数字串,不是单个数字,例如256,压栈的是256,而不是2 、5 、6)
(2)如果是运算符,则从栈中退出两个元素,进行相应的运算后,把结果压入栈中(注意出栈元素的顺序)
2、继续读入,直到遇到'#'
二、代码实现
#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; } 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++; } 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; double d, e; char str[MAXBUFFER]; int i = 0; InitStack( &s ); printf("请按逆波兰表达式输入待计算数据,数据与运算符之间用空格隔开,以#作为结束标志: \n"); scanf("%c", &c); while( c != '#' ) { while( isdigit(c) || c=='.' ) // 用于过滤数字,不要把小数过滤掉了 { str[i++] = c; str[i] = '\0'; if( i >= 10 ) { printf("出错:输入的单个数据过大!\n"); return -1; } scanf("%c", &c); if( c == ' ' )//遇到空格符就压入那个数字串 { d = atof(str);//把字符串转换成浮点数 Push(&s, d); i = 0; break; } } switch( c ) { case '+': Pop(&s, &e); Pop(&s, &d); Push(&s, d+e); break; case '-': Pop(&s, &e); Pop(&s, &d); Push(&s, d-e); break; case '*': Pop(&s, &e); Pop(&s, &d); Push(&s, d*e); break; case '/': Pop(&s, &e); Pop(&s, &d); if( e != 0 ) { Push(&s, d/e); } else { printf("\n出错:除数为零!\n"); return -1; } break; } scanf("%c", &c); } Pop(&s, &d); printf("\n最终的计算结果为:%f\n", d); return 0; }三、效果展示
相关文章推荐
- 【数据结构】动态栈+括号匹配+逆波兰表达式(后缀表达式计算)
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- 数据结构----顺序栈实现逆波兰表达式(后缀表达式)求解
- 逆波兰式(后缀表达式)的运用-计算四则表达式并用lex,Yacc拓展
- 数据结构--中缀表达式转为后缀表达式(逆波兰表达式)
- 逆波兰表达式(后缀表达式)及其计算
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- 我就给一个PHP逆波兰表达式的算法吧---工资计算专用
- 使用Python计算逆波兰表达式
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 二元的表达式的计算(数据结构)
- 数据结构6:使用栈计算逆波兰表达式
- 逆波兰表达式计算
- 数据结构中用C#实现“表达式计算”
- 【数据结构_栈_Stack_1043】利用栈完成后缀表达式计算
- Python3实现逆波兰表达式计算