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每日一题-逆波兰表达式求值 [题目描述] 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说 ...
随机推荐
- Poj 2993 Emag eht htiw Em Pleh
1.Link: http://poj.org/problem?id=2993 2.Content: Emag eht htiw Em Pleh Time Limit: 1000MS Memory ...
- 上传图片(基于zepto.js)
效果如下: <div class="otherPic"> <div id="showOtherImage"></div> & ...
- 滑动选择日期(基于sui-mobile的移动端)
$(page).on('touchmove','#touchMoveTime',function (event) { touchMove(event); }); scrollBarInit(); // ...
- php程序备份还原mysql数据库
<?php $link = mysql_connect("localhost", "root",""); mysql_query(&q ...
- RHEL 6.5升级GCC 4.9.3
前提:保证旧版的gcc,g++存在! root用户 1. 下载源码和依赖包源码:新建目录bakwget http://ftp.gnu.org/gnu/gcc/gcc-4.9.3/gcc-4.9.3.t ...
- FireDAC如何连接ORACLE数据库
UniDac对Oracle的Direct连接,不需要安装Oracle客户端dll,deploy时真的是方便又快捷. FireDac连接Oracle,在没有Oracle Client的情况下,是可以连接 ...
- Linux进程间通信IPC学习笔记之消息队列(Posix)
基础知识: 消息队列可认为是一个消息链表,有足够写权限的线程可往队列中放置消息,有足够读权限的线程可以从队列中取走消息.在某个进程往一人队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达. ...
- Git之不明觉厉11-利其器source tree
前面10篇文章都在用命令行,虽然装逼不错,但是我想说一句,平时我也是用source tree比较多点,命令行一般都是在source tree的图形按钮找不到在哪里,就直接用命令行.对于初次用git的同 ...
- C# 使用winForm的TreeView显示中国城镇四级联动
直接上代码吧,这里 MySql.Data.MySqlClient;需要到mysql官网下载mysql-connector-net-6.9.8-noinstall.zip 访问密码 6073 usi ...
- 【BZOJ 1911】 [Apio2010]特别行动队
Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9 HINT 转移方程 f[i]=max(f[j]+ ...