数据结构实验之栈二:一般算术表达式转换成后缀式
2016-07-28 10:20
435 查看
数据结构实验之栈二:一般算术表达式转换成后缀式
Time Limit: 1000MS Memory limit: 65536K
题目描述
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
输入
输入一个算术表达式,以‘#’字符作为结束标志。
输出
输出该表达式转换所得到的后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
ab*cde/-f*+
提示
来源
示例程序
看上去很复杂的一道题,不过只要看懂例子就好做了,但是由于之前的时候没有学过stack函数,所以在网上查了一下#include<stdio.h> #include<string.h> #include<stack> using namespace std; int main() { stack<char>sd; char str[1000]; while(~scanf("%s",str)) { for(int i = 0;str[i] != '#';i++) { if(str[i] >= 'a' && str[i] <= 'z') { printf("%c",str[i]); } else if(str[i] == '(') { sd.push(str[i]); } else if(str[i] == ')') { while( !sd.empty() && sd.top() != '(') { printf("%c",sd.top()); sd.pop(); } sd.pop(); } else if(str[i] == '+' || str[i] == '-') { while(!sd.empty() && sd.top() != '(') { printf("%c",sd.top()); sd.pop(); } sd.push(str[i]); } else if(str[i] == '*' || str[i] == '/') { while(!sd.empty() && sd.top() != '(' && (sd.top() == '*' || sd.top() == '/')) { printf("%c",sd.top()); sd.pop(); } sd.push(str[i]); } } while(!sd.empty()) { printf("%c",sd.top()); sd.pop(); } printf("\n"); } return 0; }闲不下来,又用栈做了一遍
#include<stdio.h> #include<stdlib.h> #define stackmax 10000 #define stacknum 10000 typedef struct { char *top; char *base; int stacksize; }stack; int initstack(stack &s) { s.base = (char *)malloc(stackmax*sizeof(char)); if(!s.base) exit(0); s.top = s.base; s.stacksize = stackmax; return 1; } void push(stack &s,char e) { if(s.top - s.base > s.stacksize) { s.base = (char *)malloc((stackmax + stacknum)*sizeof(char)); if(!s.base)exit(0); s.top = s.base + s.stacksize; s.stacksize += stacknum; } *s.top++ = e; } void pop(stack &s) { s.top--; printf("%c",*s.top); } void choose(stack &s,char str[]) { for(int i = 0;str[i] != '#';i++) { if(str[i] >= 'a' && str[i] <= 'z') { printf("%c",str[i]); } else if(str[i] == '*' || str[i] == '/') { push(s,str[i]); } else if(str[i] == '+' || str[i] == '-') { if(*(s.top-1) == '*' || *(s.top-1) == '/') { pop(s); } push(s,str[i]); } else if(str[i] == '(') { push(s,str[i]); } else if(str[i] == ')') { while(*(s.top-1) != '(') { pop(s); } s.top--; } } while(s.top != s.base) { pop(s); } printf("\n"); } int main() { stack s; char str[stackmax]; gets(str); initstack(s); choose(s,str); return 0; }
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- ASP编码必备的8条原则
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- XML指南——XML编码
- C#中字符串编码处理
- ExtJS中文乱码之GBK格式编码解决方案及代码
- 程序员趣味读物 谈谈Unicode编码
- 文本文件编码方式区别
- 数据结构之Treap详解
- C语言安全编码之数值中的sizeof操作符
- C#实现获取文本文件的编码的一个类(区分GB2312和UTF8)
- VC中BASE64编码和解码使用详解
- 计算机中的字符串编码、乱码、BOM等问题详解
- Base64编码解码原理及C#编程实例
- C#编码好习惯小结
- javascript编码的几个方法详细介绍