栈之逆波兰

  1 #include<stdio.h>
  2 #include<stdio.h>
  3 #include<stack> //queue
  4 #include<string.h>
  5 using namespace std;
  6 stack<char> sck1; //cal
  7 stack<char> sck2; //num
  8 char ss[20];
  9 void transfer(char s[20],int n)
 10 {
 11     int i;
 12     for(i=0;i<n;i++)
 13     {
 14         if(s[i]==‘(‘){sck1.push(s[i]);}
 15         //左括号直接放进去。
 16
 17         else if(s[i]==‘*‘||s[i]==‘/‘)
 18         {
 19             if(sck1.empty()||sck1.top()==‘+‘||sck1.top()==‘-‘)
 20             {
 21                 sck1.push(s[i]);continue;
 22             }
 23             //判断如果是空的或者是栈顶是+ -的就直接放入。先进先出。注意点在于判断空得在前面。否则会报错。
 24             else
 25             {
 26                 while((!sck1.empty())&&sck1.top()!=‘(‘)//这个放到左括号也得考虑啊。
 27             {
 28                 sck2.push(sck1.top());sck1.pop();
 29             }
 30             sck1.push(s[i]);
 31             }
 32             //把和自己相同优先级的先拿出来。(因为是从左往右算的)。最后记得放入这个符号。
 33         }
 34         // * / 符号的做法
 35
 36         else if(s[i]==‘)‘)
 37         {
 38             while(sck1.top()!=‘(‘){sck2.push(sck1.top());sck1.pop();}
 39             sck1.pop();
 40         }
 41         // 右括号。就把运算符都放进数字栈里。直到遇到左括号。最后记得把左括号拿掉。
 42         else if(s[i]==‘+‘||s[i]==‘-‘)
 43         {
 44             while((!sck1.empty())&&sck1.top()!=‘(‘)
 45             {
 46                 sck2.push(sck1.top());
 47                 sck1.pop();
 48             }
 49
 50             sck1.push(s[i]);
 51         }
 52         //遇到+ - 符号的话。就把符号都拿出来。最后放入自己的。因为就算相同优先级或者高的优先级。都是一样的。
 53
 54         else{sck2.push(s[i]);}
 55         //数字的话 就直接放进数字栈了。注意不要把2个栈写反写乱了。
 56     }
 57     while(!sck1.empty())
 58     {
 59         sck2.push(sck1.top());
 60         sck1.pop();
 61     }
 62 }
 63
 64 int main()
 65 {
 66     char s[20];
 67     int n;
 68     int i;
 69     while(scanf("%s",s)!=EOF)
 70     {
 71         i = 0;
 72         n = strlen(s);
 73         transfer(s,n);
 74         while(!sck2.empty())
 75         {
 76             ss[i++] = sck2.top();
 77             sck2.pop();
 78         }
 79         printf("%s\n",ss);
 80         memset(ss,0,sizeof(ss));
 81     }
 82 }
 83
 84 /*
 85 1-2*3+4
 86 123*-4+
 87
 88 1-2+3
 89 12-3+
 90
 91 1-2+3-4
 92 12-3+4-
 93
 94 ((1+2)+3)*4
 95 12+3+4*
 96
 97 (1+2)*(3-4)
 98 12+34-*
 99
100 (1+2)*((1+2)+3)*4
101 12+12+3+*4*
102
103      mark
104      number  1 2 *
105  判空
106   */

时间: 2024-10-19 23:03:57

栈之逆波兰的相关文章

栈,逆波兰表达式???

这两天一直在想老师提出的要求:四个数的运算,让一个函数去实现,一次性的把四个数字以及三个运算符传递过去(数是随机产生的,运算符是随机产生的),说到随机产生运算符下面是我写的随机产生运算符的例子,但是还是没有达到自己想要的要求,自己也上网查了一些资料,但是介绍的都不是很详细,看不太懂,而且大部分都是些怎么不让其产生重复的元素. 这样写的结果是有些情况永远也出不来而且这样写的结果就好像是每一个数组里面的元素就好像是商量好了一样,说第几个元素出来就第几个元素出来,请求老师指导一下. 还说四个数的运算吧

栈实现逆波兰表达式

栈实现逆波兰表达式 2015-04-05 Lover雪儿 1 //逆波兰表达式 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <ctype.h> 6 7 #define STACK_INIT_SIZE 20 //初始栈大小 8 #define STACK_INCREMENT 10 //扩充栈时每次增加的内存 9 #define MAXBUFFER 10 //

利用栈实现逆波兰算法

1.逆波兰表达式? 在我们的普遍认知中,计算的优先级总是和()相关,形如(1+2)*(3+4)这样的式子,我们看起来十分的清晰明了,但对计算机来说,它会进行很多次的判断来确定一个运算的优先级.于是在很久很久之前就有一个人发现,如果我们将上述算式写成形如1 2 + 3 4 + *的形式,计算机判断起来会显得格外的快,效率也会更高,然而它的实现原理是什么样的呢. 2.算法分析 经过观察,我们发现该算式将参数放在前面,运算操作符放在两个要进行计算的参数之后,我们可以得出这样的思路:每次我们将拿到的数据

栈应用——逆波兰式表达式的值

问题描述: 计算给定的逆波兰表达式(即后缀表达式)的值. 事实上,二元运算的前提下,中缀表达式可以对应一棵二叉树:逆波兰式即该二叉树后序遍历的结果. 分析思路: 如果当前是操作数,则直接入栈: 如果当前是操作符,则栈顶的两个元素弹出,然后与当前操作符运算后入栈. Code: /** * 给出一个逆波兰式,计算该表达式的值 * @param s * @return */ public int getTheValueOfRPN(String s) { char[] ch = s.toCharArra

栈的应用---用栈计算逆波兰表达式

#include<stdio.h> #include<stdlib.h> struct Node; typedef struct Node *PtrToNode; typedef PtrToNode Stack; struct Node{ int Ele; PtrToNode Next; }; Stack CreateStack( void ) { Stack S; S = malloc( sizeof( struct Node ) ); if(S == NULL ) printf

续前篇-关于逆波兰表达式的计算

相对于逆波兰表达式的转换,逆波兰表达的计算可谓简单不少. 具体计算方法参考:http://www.cnblogs.com/vpoet/p/4659546.html 这里也大致梳理一下: 1.新建一个栈将逆波兰表达式的数字依次压入栈中 2.当遇到运算符时,出栈两个数同时将运算结果压栈 3.重复步骤2直到计算计算,栈中的元素即为逆波兰表达式的计算结果. 实现如下: 1 #include <iostream> 2 #include <stack> 3 using namespace st

逆波兰式

在程序设计中,可能碰到需要对字符串数学表达式求值的问题,常用的方法是解析表达式,生成二叉树,然后进行计算.编译器就是使用这种方法来解析程序中的表达式的.这种方法实现起来有点难度,需要考虑运算符的优先级,括号的配对,堆栈的使用等等.我们正常情况下看到的数学表达式如果用二叉树遍历的话,恰好是中序遍历,故叫做中序表达式.除此之外,还有前序表达式,后序表达式.如:a+b+c(中序),++abc(前序),ab+c+(后序),如果表达式含有×,/,()等就更复杂了. 后缀表达式也称逆波兰表达式 因其使表达式

HDU1237 简单计算器 【栈】+【逆波兰式】

版本:1.0 日期:2014.5.17 2014.6.1 版权:© 2014 kince 转载注明出处 在介绍SwitchButton之前,先来看一下系统Button是如何实现的.源码如下: @RemoteView public class Button extends TextView { public Button(Context context) { this(context, null); } public Button(Context context, AttributeSet att

逆波兰式,有关栈的问题

/*有关逆波兰式的问题,也叫后缀表达式(将运算符写在操作数之后):例如:a+b的逆波兰式为a b +;下列程序是有关数字与数字相加的,将程序简单理解为,如果是数字,那么压入栈中,如果是运算符,那么出栈,将此前压入栈中的两个数取出栈并且相加,相加后再压入栈中,以此类推(按运算符的优先级!)*/ #include <stdio.h> #include <math.h>#include <stdlib.h>#include <ctype.h>#define STA