SDIBT2666——逆波兰表达式求值
逆波兰表达式求值(栈和队列)
Description
从键盘上输入一个逆波兰表达式,用伪码写出其求值程序。规定:逆波兰表达式的长度不超过一行,以@符作为输入结束,操作数之间用空格分隔,操作符只可能有+、-、*、/四种运算。例如:
请输入一个以'@'字符结束的中缀算术表达式:
12+(3*(20/4)-8)*6@
对应的后缀算术表达式为:
12 3 20 4 /*8 -6 *+@
求值结果为:54
Input
12+(3*(20/4)-8)*6@
Output
54
中序表达式转换为逆波兰表达式:
- #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——逆波兰表达式求值的更多相关文章
- lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值
题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...
- CH BR4思考熊(恒等有理式-逆波兰表达式求值)
恒等有理式 总时限 10s 内存限制 256MB 出题人 fotile96 提交情况 4/43 描述 给定两个有理式f(X)与g(X),判断他们是否恒等(任意A,如果f(A)与g(A)均有定义,那么f ...
- LeetCode:逆波兰表达式求值【150】
LeetCode:逆波兰表达式求值[150] 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除 ...
- Leetcode 150.逆波兰表达式求值
逆波兰表达式求值 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总 ...
- leetcode算法学习----逆波兰表达式求值(后缀表达式)
下面题目是LeetCode算法:逆波兰表达式求值(java实现) 逆波兰表达式即后缀表达式. 题目: 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式.同 ...
- LeetCode 150. 逆波兰表达式求值(Evaluate Reverse Polish Notation) 24
150. 逆波兰表达式求值 150. Evaluate Reverse Polish Notation 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, /.每个运算对象 ...
- Java实现 LeetCode 150 逆波兰表达式求值
150. 逆波兰表达式求值 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波 ...
- LeetCode150 逆波兰表达式求值
根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...
- 【python】Leetcode每日一题-逆波兰表达式求值
[python]Leetcode每日一题-逆波兰表达式求值 [题目描述] 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说 ...
随机推荐
- 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 ...
- 使用python读写windows剪切板
import win32clipboard as w import win32con base_addr = 0x8e00000 buffer_len = 0x123 def getText(): w ...
- phpcms v9 自定义分页 带下拉跳转
<?php function new_pages($num, $curr_page, $perpage = 20, $urlrule = '', $array = array(),$setpag ...
- 2014年辛星完全解读Javascript第五节 break和continue与错误处理
先说一下break和continue的主要用法吧,break用于跳出循环,continue用于跳过该循环中的一个迭代.简单的说,就是break直接从该语句跳出,但是continue不会跳出该循环语句, ...
- Eclipse开发Android报错Jar mismatch! Fix your dependencies
常常打开工程,发现项目并没有错,但是会有一个红X,然后就生成不了. 发现两个版本不同的android-support-v4.jar在使用 打开window-show views-problems Ja ...
- PL/SQL中如何执行DDL、SCL?
PL/SQL程序中不能直接执行DDL语句.为什么? 假设我们在pl/sql程序中有这样的一条DDL语句—— drop table emp:在第一次解析pl/sql中的“drop table emp;” ...
- oracle的function和procedure返回值给shell
本文演示两个关于如何在shell中调用oracle的function和procedure,并将返回值返回给shell. 1.首在package中创建function和procedure,脚本如下: G ...
- mybatis随意sql语句
mybatis的mapper.xml随意sql语句, 不管表之间存不存在关系, 都可以使用, 但注意resultMap中一定要指定查询数据返回的列 或 对象(其实就是多列封装到一个对象中) <? ...
- 使用Yeoman搭建 AngularJS 应用 (9) —— 让我们搭建一个网页应用
原文地址:http://yeoman.io/codelab/install-packages.html 列出当前程序包 我们现在查看一下我们已经安装的程序包,输入下面的命令 bower list 查找 ...
- HTTP幂等性
http://www.cnblogs.com/weidagang2046/archive/2011/06/04/2063696.html 理解HTTP幂等性 基于HTTP协议的Web API是时下最为 ...