逆波兰表达式求值(栈和队列)

Description

从键盘上输入一个逆波兰表达式,用伪码写出其求值程序。规定:逆波兰表达式的长度不超过一行,以@符作为输入结束,操作数之间用空格分隔,操作符只可能有+、-、*、/四种运算。例如:

请输入一个以'@'字符结束的中缀算术表达式: 
12+(3*(20/4)-8)*6@ 
对应的后缀算术表达式为: 
12 3 20 4 /*8 -6 *+@ 
求值结果为:54

Input

12+(3*(20/4)-8)*6@

Output

54

中序表达式转换为逆波兰表达式:

从中缀式的左端开始取字符,逐序进行如下步骤(需要一个栈S1和一个数组)
  (1)若取出的字符是操作数,则分析出完整的运算数,该操作数直接送入数组
  (2)若取出的字符是运算符,则将该运算符与S1栈栈顶元素比较,如果该运算符优先级大于S1栈栈顶运算符优先级,则将该运算符进S1栈,否则,将S1栈的栈顶运算符弹出,送入数组中,直至S1栈栈顶运算符低于(不包括等于)该运算符优先级,则将该运算符送入S1栈。
  (3)若取出的字符是“(”,则直接送入S1栈栈顶。
  (4)若取出的字符是“)”,则将距离S1栈栈顶最近的“(”之间的运算符,逐个出栈,依次送入数组,此时抛弃“(”。
  (5)重复上面的1~4步,直至处理完所有的输入字符
  (6)若取出的字符是“#”,则将S1栈内所有运算符(不包括“@”),逐个出栈,依次送入数组。
逆波兰表达式计算:
  新建一个表达式,如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。
PS:
  注意最后一个数字的处理!!
Code:
  1. #include<stdio.h>
  2. #define MAXN 10000
  3. typedef struct Stack
  4. {
  5. int date[MAXN];
  6. int top;
  7. } Stack;
  8. struct BL
  9. {
  10. int date;
  11. int ischar; //计算时 判断是运算符还是数值
  12. } a[];
  13. Stack s1;
  14. void Stack_Init(Stack *S)
  15. {
  16. S->top=-;
  17. }
  18. int IsEmpty(Stack *S)
  19. {
  20. if (S->top==-) return ;
  21. return ;
  22. }
  23. void push(Stack *S,int tmp)
  24. {
  25. S->top++;
  26. S->date[S->top]=tmp;
  27. }
  28. int pop(Stack *S)
  29. {
  30. int tmp;
  31. tmp=S->date[S->top];
  32. S->top--;
  33. return tmp;
  34. }
  35. int top(Stack *S)
  36. {
  37. return S->date[S->top];
  38. }
  39. int main()
  40. {
  41. char tmp;
  42. int i=,j,num=,t,t1,t2;
  43. Stack_Init(&s1);
  44. while (scanf("%c",&tmp)!=EOF)
  45. {
  46. if (tmp=='@')
  47. {
  48. if (num)
  49. {a[i].date=num;
  50. a[i++].ischar=;}
  51. break;
  52. }
  53. if (tmp>=''&&tmp<='') num=num*+tmp-;
  54. else
  55. {
  56. if (num)
  57. {
  58. a[i].date=num;
  59. num=;
  60. a[i++].ischar=;
  61. }
  62. if (tmp=='(') push(&s1,tmp);
  63. else if (tmp==')')
  64. {
  65. while (top(&s1)!='(')
  66. {
  67. t=pop(&s1);
  68. a[i].date=t;
  69. a[i++].ischar=;
  70. }
  71. pop(&s1);
  72. }
  73. else if (tmp=='+'||tmp=='-')
  74. {
  75. while (IsEmpty(&s1)!=&&top(&s1)!='(')
  76. {
  77. t=pop(&s1);
  78. a[i].date=t;
  79. a[i++].ischar=;
  80. }
  81. push(&s1,tmp);
  82. }
  83. else if (tmp=='*'||tmp=='/')
  84. {
  85. while (IsEmpty(&s1)!=&&(top(&s1)!='+'&&top(&s1)!='-')&&top(&s1)!='(')
  86. {
  87. t=pop(&s1);
  88. a[i].date=t;
  89. a[i++].ischar=;
  90. }
  91. push(&s1,tmp);
  92. }
  93. }
  94. }
  95. while (IsEmpty(&s1)!=)
  96. {
  97. t=pop(&s1);
  98. a[i].date=t;
  99. a[i++].ischar=;
  100. }
  101. for (j=; j<i; j++)
  102. if (a[j].ischar)
  103. {
  104. t1=pop(&s1);t2=pop(&s1);
  105. if (a[j].date=='*'){t1=t2*t1;push(&s1,t1);}
  106. if (a[j].date=='/'){t1=t2/t1;push(&s1,t1);}
  107. if (a[j].date=='+'){t1=t2+t1;push(&s1,t1);}
  108. if (a[j].date=='-'){t1=t2-t1;push(&s1,t1);}
  109. }
  110. else push(&s1,a[j].date);
  111. printf("%d",top(&s1));
  112. return ;
  113. }

SDIBT2666——逆波兰表达式求值的更多相关文章

  1. lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

    题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...

  2. CH BR4思考熊(恒等有理式-逆波兰表达式求值)

    恒等有理式 总时限 10s 内存限制 256MB 出题人 fotile96 提交情况 4/43 描述 给定两个有理式f(X)与g(X),判断他们是否恒等(任意A,如果f(A)与g(A)均有定义,那么f ...

  3. LeetCode:逆波兰表达式求值【150】

    LeetCode:逆波兰表达式求值[150] 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除 ...

  4. Leetcode 150.逆波兰表达式求值

    逆波兰表达式求值 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总 ...

  5. leetcode算法学习----逆波兰表达式求值(后缀表达式)

    下面题目是LeetCode算法:逆波兰表达式求值(java实现) 逆波兰表达式即后缀表达式. 题目:  有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式.同 ...

  6. LeetCode 150. 逆波兰表达式求值(Evaluate Reverse Polish Notation) 24

    150. 逆波兰表达式求值 150. Evaluate Reverse Polish Notation 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, /.每个运算对象 ...

  7. Java实现 LeetCode 150 逆波兰表达式求值

    150. 逆波兰表达式求值 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波 ...

  8. LeetCode150 逆波兰表达式求值

    根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...

  9. 【python】Leetcode每日一题-逆波兰表达式求值

    [python]Leetcode每日一题-逆波兰表达式求值 [题目描述] 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说 ...

随机推荐

  1. What are Upgrade, Product and Package Codes used for? By pusu

    Following content is reprinted from here, please go to the original website for more information. Au ...

  2. 使用python读写windows剪切板

    import win32clipboard as w import win32con base_addr = 0x8e00000 buffer_len = 0x123 def getText(): w ...

  3. phpcms v9 自定义分页 带下拉跳转

    <?php function new_pages($num, $curr_page, $perpage = 20, $urlrule = '', $array = array(),$setpag ...

  4. 2014年辛星完全解读Javascript第五节 break和continue与错误处理

    先说一下break和continue的主要用法吧,break用于跳出循环,continue用于跳过该循环中的一个迭代.简单的说,就是break直接从该语句跳出,但是continue不会跳出该循环语句, ...

  5. Eclipse开发Android报错Jar mismatch! Fix your dependencies

    常常打开工程,发现项目并没有错,但是会有一个红X,然后就生成不了. 发现两个版本不同的android-support-v4.jar在使用 打开window-show views-problems Ja ...

  6. PL/SQL中如何执行DDL、SCL?

    PL/SQL程序中不能直接执行DDL语句.为什么? 假设我们在pl/sql程序中有这样的一条DDL语句—— drop table emp:在第一次解析pl/sql中的“drop table emp;” ...

  7. oracle的function和procedure返回值给shell

    本文演示两个关于如何在shell中调用oracle的function和procedure,并将返回值返回给shell. 1.首在package中创建function和procedure,脚本如下: G ...

  8. mybatis随意sql语句

    mybatis的mapper.xml随意sql语句, 不管表之间存不存在关系, 都可以使用, 但注意resultMap中一定要指定查询数据返回的列 或 对象(其实就是多列封装到一个对象中) <? ...

  9. 使用Yeoman搭建 AngularJS 应用 (9) —— 让我们搭建一个网页应用

    原文地址:http://yeoman.io/codelab/install-packages.html 列出当前程序包 我们现在查看一下我们已经安装的程序包,输入下面的命令 bower list 查找 ...

  10. HTTP幂等性

    http://www.cnblogs.com/weidagang2046/archive/2011/06/04/2063696.html 理解HTTP幂等性 基于HTTP协议的Web API是时下最为 ...