题目链接

将中缀表达式转化为后缀表达式。

数字的话直接放到答案的字符串里。

如果是左括号就进栈, 右括号就让栈里的符号都出来直到第一个左括号。

否则的话比较当前符号的优先级和栈顶符号的优先级。

  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <algorithm>
  6. #include <complex>
  7. #include <cmath>
  8. #include <map>
  9. #include <set>
  10. #include <string>
  11. #include <queue>
  12. #include <stack>
  13. #include <bitset>
  14. using namespace std;
  15. #define pb(x) push_back(x)
  16. #define ll long long
  17. #define mk(x, y) make_pair(x, y)
  18. #define lson l, m, rt<<1
  19. #define mem(a) memset(a, 0, sizeof(a))
  20. #define rson m+1, r, rt<<1|1
  21. #define mem1(a) memset(a, -1, sizeof(a))
  22. #define mem2(a) memset(a, 0x3f, sizeof(a))
  23. #define rep(i, n, a) for(int i = a; i<n; i++)
  24. #define fi first
  25. #define se second
  26. typedef complex <double> cmx;
  27. typedef pair<int, int> pll;
  28. const double PI = acos(-1.0);
  29. const double eps = 1e-8;
  30. const int mod = 1e9+7;
  31. const int inf = 1061109567;
  32. const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
  33. map <char, int> sign;
  34. vector <char> ans;
  35. void solve() {
  36. ans.clear();
  37. stack <char> st;
  38. string s;
  39. cin>>s;
  40. int last = 6;
  41. for(int i = 0; i < s.size(); i++) {
  42. char c = s[i];
  43. if(isalnum(c)) {
  44. ans.pb(c);
  45. } else {
  46. if(c == '(') {
  47. st.push(c);
  48. last = 6;
  49. } else if(c == ')') {
  50. char tmp;
  51. tmp = st.top();
  52. st.pop();
  53. do {
  54. ans.pb(tmp);
  55. tmp = st.top();
  56. st.pop();
  57. } while (tmp != '(');
  58. last = 6;
  59. } else {
  60. if(sign[c]>=last) {
  61. ans.pb(c);
  62. } else {
  63. st.push(c);
  64. last = sign[c];
  65. }
  66. }
  67. }
  68. }
  69. for(auto &i: ans) {
  70. cout<<i;
  71. }
  72. cout<<endl;
  73. }
  74. void init() {
  75. sign['+'] = 1;
  76. sign['-'] = 2;
  77. sign['*'] = 3;
  78. sign['/'] = 4;
  79. sign['^'] = 5;
  80. }
  81. int main()
  82. {
  83. init();
  84. int t;
  85. cin>>t;
  86. while(t--) {
  87. solve();
  88. }
  89. return 0;
  90. }

spoj ONP - Transform the Expression 中缀转后缀的更多相关文章

  1. SPOJ #4 Transform the Expression

    Not hard to know it is simply transform from in-order to post-order.My first idea is to build a tree ...

  2. C语言 中缀转后缀

    给定字符串型的算术表达式,实现中缀转后缀并运算得出结果: #ifndef STACK_H_INCLUDED #define STACK_H_INCLUDED #include <stdio.h& ...

  3. 数据结构之栈—强大的四则复杂运算计算器(超过windows自带的科学计算器)【中缀转后缀表达式】

    比windows自带计算器还强的四则复杂运算计算器! 实测随机打出两组复杂算式:-7.5 * 6 / ( -2 + ( -6.5 -  -5.22 ) )与7.5+-3*8/(7+2) windows ...

  4. 栈的应用1——超级计算器(中缀与后缀表达式)C语言

    这里要学的程序主要用来实现一个功能——输入表达式输出结果,也就是一个计算器.效果如下: 这个程序主要有两个步骤:1.把中缀表达式转换为后缀表达式:2.计算后缀表达式的结果. 首先先明白几个问题: 1. ...

  5. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  6. 【SPOJ】Longest Common Substring II (后缀自动机)

    [SPOJ]Longest Common Substring II (后缀自动机) 题面 Vjudge 题意:求若干个串的最长公共子串 题解 对于某一个串构建\(SAM\) 每个串依次进行匹配 同时记 ...

  7. C++ 中缀转后缀表达式并求值

    //中缀转后缀 #include<iostream> #include<stack> using namespace std; int prio(char x){ ; ; ; ...

  8. Java数据结构和算法(六):前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  9. java四则运算----前缀、中缀、后缀表达式

    接到一个新需求,需要实现可配置公式,然后按公式实现四则运算. 刚拿到需求,第一反应就是用正则匹配‘(’,‘)’,‘+’,‘-’,‘*’,‘/’,来实现四则运算,感觉不复杂. 然后开始coding.发现 ...

随机推荐

  1. 枚举基类Enum详解

    本文主要是对枚举类型的基类Enum类做一个介绍: 首先,Enum类位于java.lang包下,根据类的介绍可以发现,Enum类是Java中所有枚举类的父类,将枚举作为一个set或者Map的keys来使 ...

  2. oracle中set define off

    set define off关闭替代变量功能 在SQL*Plus中默认的"&"表示替代变量,也就是说,只要在命令中出现该符号,SQL*Plus就会要你输入替代值.这就意味着 ...

  3. ToString()的浅显解释(转)

    转自:http://zhidao.baidu.com/link?url=2g3NZ8tmL635L5XmWUh5i-mAlAsySunJryiq2Jl0LRsM691049dOwhoXy-8kJ6HL ...

  4. CentOS 6 安装 python and pip

    yum update yum list python*     //查看可安装python包 yum install python34.i686_64 wget https://bootstrap.p ...

  5. Java与C++相异的地方

    继承标识:Java使用extends/implement,C++使用: super:调用父类的某些东西 instanceof:RTTI机制(A is instanceif B) final:类似于C+ ...

  6. BZOJ 3648: 寝室管理( 点分治 + 树状数组 )

    1棵树的话, 点分治+你喜欢的数据结构(树状数组/线段树/平衡树)就可以秒掉, O(N log^2 N). 假如是环套树, 先去掉环上1条边, 然后O(N log^2 N)处理树(同上); 然后再O( ...

  7. 【JQ学习笔记】提示的效果

    <p><a href="#" class="tooltip" title="这是我的超链接提示1.">提示1.< ...

  8. Android 软键盘小知识点

    chatText = (EditText) findViewById(R.id.chatText); chatText.setOnKeyListener(new OnKeyListener() { p ...

  9. 识别Json字符串并分隔成Map集合

    识别Json字符串并分隔成Map集合 前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新 ...

  10. jQuery创建节点

    注:摘自<锋利的jQuery(第二版)> 创建元素节点 例如要创建两个<li>元素节点,并且要把它们作为<ul>元素节点的子节点添加到DOM节点树上.完成这个任务需 ...