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

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:
 #include<stdio.h>
#define MAXN 10000
typedef struct Stack
{
int date[MAXN];
int top;
} Stack;
struct BL
{
int date;
int ischar; //计算时 判断是运算符还是数值
} a[];
Stack s1;
void Stack_Init(Stack *S)
{
S->top=-;
}
int IsEmpty(Stack *S)
{
if (S->top==-) return ;
return ;
}
void push(Stack *S,int tmp)
{
S->top++;
S->date[S->top]=tmp;
}
int pop(Stack *S)
{
int tmp;
tmp=S->date[S->top];
S->top--;
return tmp;
}
int top(Stack *S)
{
return S->date[S->top];
}
int main()
{
char tmp;
int i=,j,num=,t,t1,t2;
Stack_Init(&s1);
while (scanf("%c",&tmp)!=EOF)
{
if (tmp=='@')
{
if (num)
{a[i].date=num;
a[i++].ischar=;}
break;
}
if (tmp>=''&&tmp<='') num=num*+tmp-;
else
{
if (num)
{
a[i].date=num;
num=;
a[i++].ischar=;
}
if (tmp=='(') push(&s1,tmp);
else if (tmp==')')
{
while (top(&s1)!='(')
{
t=pop(&s1);
a[i].date=t;
a[i++].ischar=;
}
pop(&s1);
}
else if (tmp=='+'||tmp=='-')
{
while (IsEmpty(&s1)!=&&top(&s1)!='(')
{
t=pop(&s1);
a[i].date=t;
a[i++].ischar=;
}
push(&s1,tmp);
}
else if (tmp=='*'||tmp=='/')
{
while (IsEmpty(&s1)!=&&(top(&s1)!='+'&&top(&s1)!='-')&&top(&s1)!='(')
{
t=pop(&s1);
a[i].date=t;
a[i++].ischar=;
}
push(&s1,tmp);
}
}
}
while (IsEmpty(&s1)!=)
{
t=pop(&s1);
a[i].date=t;
a[i++].ischar=;
}
for (j=; j<i; j++)
if (a[j].ischar)
{
t1=pop(&s1);t2=pop(&s1);
if (a[j].date=='*'){t1=t2*t1;push(&s1,t1);}
if (a[j].date=='/'){t1=t2/t1;push(&s1,t1);}
if (a[j].date=='+'){t1=t2+t1;push(&s1,t1);}
if (a[j].date=='-'){t1=t2-t1;push(&s1,t1);}
}
else push(&s1,a[j].date);
printf("%d",top(&s1));
return ;
}

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. nginx gzip filter模块分析

    API:http://refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/zlib-deflateinit2.html ...

  2. winForm 中子窗体关闭但不释放对象,方便下次继续打开

    方法一: 修改子窗体中自动生成的Dispose方法(在Form.Designer.cs文件中) /// <summary> /// Clean up any resources being ...

  3. Mysql MyISAM数据库批量转换表引擎为Innodb

    Mysql MyISAM数据库批量转换表引擎为Innodb 最近在做事物处理需要把表结构都改为带有支持事物的Innodb引擎格式, 把里面数据库 用户名.密码 等信息修改为你自己的,放在网站下运行即可 ...

  4. Android:启动引导页实现

    前言 基本上现在所有的应用都会有一个欢迎界面,在欢迎界面对应用做一个整体的介绍,然后在跳入到主界面,这次要说的这个引导页就是带翻页的引导页.效果如下所示

  5. Linux下SCP的使用

    一.下载远程文件到本地 scp -i /Users/user/ssh/id_rsa root@192.168.1.8:/root/talk_server_redis/dump.rdb /Users/k ...

  6. 在PHP中如何使用消息列队

    /** * 消息列队服务 * @author zhou.tingze * @example * -----------------------------------Create----------- ...

  7. [译]servlet3.0与non-blocking服务端推送技术

    Non-blocking(NIO)Server Push and Servlet 3 在我的前一篇文章写道如何期待成熟的使用node.js.假定有一个框架,基于该框架,开发者只需要定义协议及相关的ha ...

  8. lnmp安装--php安装

    版本:php5.6.4 x86_64 centos 6.6 x86_64 安装php之所以难,是因为要安装的扩展多,依赖关系复杂. 安装前的准备: 先看你想要安装哪些扩展.需要哪些包.下载地址:htt ...

  9. 在asp.net mvc中如何使用Grid++ Report (锐浪报表)

    在asp.net mvc中如何使用Grid++ Report (锐浪报表) 在cshtml,razor中的处理方法 以官方的asp.net(csharp)中的第一个示例"1a.简单表格&qu ...

  10. sql查找最小缺失值与重用被删除的键(转载)

    转载自:http://blog.csdn.net/yanghua_kobe/article/details/6262550 在数据处理时,我们经常会使用一些“自增”的插入方式来处理数据.比如学生学号: ...