数据结构6:使用栈计算逆波兰表达式
2014-04-08 21:36
537 查看
1、对于一个逆波兰表达式,需要判断出哪些是数字(整型、浮点型),同时判断出操作运算符,如何入栈呀?
====>搜的方法,没有说什么来区分数字还是操作符(所以我想问题就是个渣渣!),将所有的输入都作为字符输入!通过两个循环判断,外循环来判断整个字符串的结束;内循环利用空格来判断结束;
2、比较有意义的一点就是:比如,我原本是想输入整型12,计算机内存储是 49 50,通过一个字符数组a[0] = 49;a[1] = 50,然后再利用函数atof,将字符串转换成一个浮点型数据,再来处理!
3、但是如果是 3 -4 *,有负数该怎么处理呢?
====>搜的方法,没有说什么来区分数字还是操作符(所以我想问题就是个渣渣!),将所有的输入都作为字符输入!通过两个循环判断,外循环来判断整个字符串的结束;内循环利用空格来判断结束;
2、比较有意义的一点就是:比如,我原本是想输入整型12,计算机内存储是 49 50,通过一个字符数组a[0] = 49;a[1] = 50,然后再利用函数atof,将字符串转换成一个浮点型数据,再来处理!
3、但是如果是 3 -4 *,有负数该怎么处理呢?
#include <stdio.h> #include <math.h> #include <stdlib.h> #include <ctype.h> #define MAXSIZE 100 #define OK 1 #define ERROR 0 #define INCREACEMENT 10 typedef float ElemType; typedef int Status; typedef struct{ ElemType *base; ElemType *top; int Length; }SqStack; void InitStack(SqStack *S) { S->base = (ElemType *)malloc(MAXSIZE*sizeof(ElemType)); if (!S->base) { printf("Game Over"); exit(1); } S->top = S->base; S->Length = MAXSIZE;//该参数应该是整个数组的长度,而不是数据元素的长度,因为长度可以S->top-S->base得出! } void Push(SqStack *S,ElemType e) { if (S->top - S->base >= S->Length) { S->base = (ElemType *)realloc(S->base,(INCREACEMENT+S->Length)*sizeof(ElemType)); if (!S->base) { printf("Game Over"); exit(1); } S->top = S->base +S->Length; S->Length += INCREACEMENT; } *(S->top) = e; S->top++; } Status Pop(SqStack *S,ElemType *e) { if (S->top == S->base) { printf("There is no element"); exit(1); } *e = *--(S->top); return OK; } int main() { ElemType c,d; float temp=0; char e,str[MAXSIZE] = {0}; SqStack S; int i = 0; InitStack(&S);//忘了初始化了,尼妹! printf("输入逆波兰表达式,数字与表达式中使用空格隔开:"); scanf("%c",&e); while(e != '\n') { while(isdigit(e) || e == '.') //不明白为什么要判断是不是数字,我觉得没有意义啊 { str[i] = e; i++; str[i] = '\0'; //注意最后一定要加上\0! scanf("%c",&e); if (e == ' ') { temp = atof(str); Push(&S,temp); i = 0; break; } } switch(e) { case '+': Pop(&S,&c); Pop(&S,&d); Push(&S,c+d); break; case '-': Pop(&S,&c); Pop(&S,&d); Push(&S,d-c); break; case '*': Pop(&S,&c); Pop(&S,&d); Push(&S,c*d); break; case '/': Pop(&S,&c); Pop(&S,&d); Push(&S,d/c); break; } //将字符串转换为浮点型数据,并压入栈中 scanf("%C",&e); } printf("%f",*(--S.top)); system("pause"); }
相关文章推荐
- [数据结构与算法]栈的应用:计算 2*2+(10-2)/(101-50*2)*3-2+5 表达式的值
- 数据结构之应用"栈(Stack)"实现: 解析算术表达式及计算
- C++数据结构与STL--栈的应用--后缀表达式的计算
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 使用堆栈结构进行字符串表达式("7*2-5*3-3+6/3")的计算
- 数据结构-栈-计算后缀表达式
- 数据结构实验:栈实现计算器(表达式计算)
- 数据结构(java语言描述)链栈的使用——表达式求值
- 数据结构与算法之栈的应用“逆波兰表达式法”
- 数据结构之用栈实现逆波兰表达式
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 使用Python计算逆波兰表达式
- java基础(三)------ java中的switch选择结构可以使用那些数据类型的数据作为表达式?
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- c++ 数据结构 利用顺序栈计算后缀表达式的值
- 用于并行计算的多线程数据结构,第 2 部分: 设计不使用互斥锁的并发数据结构
- 数据结构算法之表达式自动计算
- 数据结构实验课程----实验三(算术表达式的计算)
- 利用栈结构计算代数表达式的值
- Java中使用正则表达式处理文本数据