数据结构实验之栈二:一般算术表达式转换成后缀式
来源:互联网 发布:大秦帝国 纵横 知乎 编辑:程序博客网 时间:2024/06/06 01:56
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Example Input
a*b+(c-d/e)*f#
Example Output
Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Example Input
a*b+(c-d/e)*f#
Example Output
ab*cde/-f*+
2017.10 OJ数据加强后代码已经更新,且保留原始漏洞代码进行比对
思路 : 中缀表达式 转化成为 后缀表达式 方法如下。
根据优先顺序可以知道先算乘法,后算加法。若果出现 a*b+c 的情况 后缀表达式应该是 ab*c+。 可以推出来 如果当前的运算符号 的优先级 比 栈里面的优先级小,那么就需要把栈里面所有比当前运算符优先级高的运算符号逐个输出,并且从栈里删除。
如果出现了括号的话,那么需要先对括号里面的算式作为一个单独的算式输出完毕后 在把它放到整个大的算式里逐个输出。
#include <iostream>#include <cstdio>#include <cstring>#include <stack>#include<algorithm>using namespace std;int a[150];int main(){ stack <char > q; int n,i; char s[150]; cin >> s; n=strlen(s); for(i=0; i<n; i++) { if(s[i]!='#') { if(s[i]>='a' && s[i]<='z')//遇到 字母 直接输出 { printf("%c",s[i]); } else if(s[i]=='(')//左括号入栈 { q.push(s[i]); } else if (s[i]==')') { while(q.top()!= '(')//左括号之前的所有运算符全部出栈 { cout << q.top(); q.pop(); } q.pop(); } else if (s[i]=='*' || s[i]=='/') { q.push(s[i]);// 乘除入栈 } else if(s[i]=='+'||s[i]=='-') { while (!q.empty()&& q.top()!='(' &&(q.top()=='*'||q.top()=='/')) // 栈中 比 + - 优先级高级的率先出栈 { cout <<q.top(); q.pop(); } q.push(s[i]); } } else { break; } } while (!q.empty()) //栈中没出栈的出栈 { cout << q.top(); q.pop(); } return 0;}
//2017.10.15 由于后台数据更新,数据加强,上述代码出现bug,具体bug为:
a+b-c 输出 abc-+
a*b/c 输出 abc/*
抽象数据类型栈操作修改代码如下
#include <stdio.h>#include <stdlib.h>#include <string.h>#define initsize 100#define add 10typedef char elemtype;typedef int status;typedef struct{ elemtype *base; elemtype *top; int stacksize;} sqstack;void initstack(sqstack &s){ s.base = (elemtype *) malloc((initsize)* sizeof(elemtype)); s.top=s.base; s.stacksize = initsize;}void push(sqstack &s, elemtype e){ if(s.top - s.base >= s.stacksize) { s.base = (elemtype *) realloc(s.base, (initsize + add) * sizeof(elemtype)); s.top = s.base + s.stacksize; s.stacksize +=add; } *s.top++ =e;}status pop (sqstack &s){ if(s.base == s. top) return 0; else { s.top--; return *s.top; }}char gettop(sqstack &s){ if(s.base == s.top) return false; else return *(s.top-1);}status isempty(sqstack &s){ if(s.base ==s.top ) return 1; else return 0;}int main(){ char a[100100]; scanf("%s",a); sqstack s; initstack(s); int n= strlen(a); for(int i=0; i<n; i++) { if(a[i] =='#') break; else { if(a[i] >='a' && a[i] <='z') { printf("%c",a[i]); } else if(a[i] == '(') { push(s, a[i]); } else if(a[i] ==')') { while(gettop(s) !='(') { printf("%c",gettop(s)); pop(s); } pop(s); } else if (a[i] == '*' ||a[i] == '/') { if(!isempty(s)) { if(gettop(s)=='*' ||gettop(s) == '/') { printf("%c",gettop(s)); pop(s); } } push(s,a[i]); } else if(a[i] == '+' ||a[i] == '-') { while (!isempty(s) && gettop(s) !='(') { printf("%c",gettop(s)); pop(s); } push(s,a[i]); } } } while (!isempty(s)) { printf("%c",gettop(s)); pop(s); } printf("\n"); return 0;}
阅读全文
0 0
- SDUT2132数据结构实验之栈二:一般算术表达式转换成后缀式(栈)
- 数据结构实验之栈二:一般算术表达式转换成后缀式(栈)
- 数据结构实验之栈二:一般算术表达式转换成后缀式(手写栈)
- 数据结构实验之栈二:一般算术表达式转换成后缀式(栈)
- [SDUT](2132)数据结构实验之栈二:一般算术表达式转换成后缀式 ---栈
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- SDUT 2132 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- SDUT OJ 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- SDUT 2132 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- [html5入门-27]CSS布局奇淫巧计之-强大的负边距
- LeetCode 38. Count and Say
- javascript总结
- git中Please enter a commit message to explain why this merge is necessary. Please enter a commit mess
- for,while循环,if判断格式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- opencv 摄像头/视频读取_写入
- 【总结】嵌入式Linux学习中遇到的问题及解决方法
- SpringMVC_interceptor拦截器
- USACO-Section1.4 Arithmetic Progressions【暴力枚举】
- 最短路 poj flyod
- Unity自定义组件之(五) 目录树 UITree
- 一点关于cookie的知识
- 逻辑运算