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

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. 引用、return

    C语言中没有引用,引用(reference)是c++对c语言的重要扩充.通俗点说,引用就是“起别名”.比如变量data,和它的引用 RefData.虽然名字不同,但是操作他们的时候,都操作的是相同的内 ...

  2. MFC中获取指针的方法

    1.获取应用程序指针 CMyApp* pApp=(CMyApp*)AfxGetApp(); 2.获取主框架指针 CWinApp 中的公有成员变量 m_pMainWnd 就是主框架的指针 CMainFr ...

  3. 转 Linux命令及Linux终端的20个趣事

    https://linux.cn/article-2831-1.html 1. 命令:sl (蒸汽机车) 你可能了解 ‘ls’ 命令,并经常使用它来查看文件夹的内容.但是,有些时候你可能会拼写成 ‘s ...

  4. Spark Streaming揭秘 Day13 数据安全容错(Driver篇)

    Spark Streaming揭秘 Day13 数据安全容错(Driver篇) 书接上回,首先我们要考虑的是在Driver层面,有哪些东西需要维持状态,只有在需要维持状态的情况下才需要容错,总的来说, ...

  5. 爬虫学习之基于Scrapy的网络爬虫

    ###概述 在上一篇文章<爬虫学习之一个简单的网络爬虫>中我们对爬虫的概念有了一个初步的认识,并且通过Python的一些第三方库很方便的提取了我们想要的内容,但是通常面对工作当作复杂的需求 ...

  6. NVIDIA显卡设置提升MineCraft流畅度

    很喜欢MineCraft(我的世界)这款游戏.可09年Y450的配置现在看来有点弱,尽管将Y450的CPU升级至了2.8Ghz的T9600,内存升级至1066Mhz的4G双通道内存,硬盘更换为128G ...

  7. WPF简单入门总结

    WPF简单总结 最近看了点关于WPF的东西,总结了点点入门的东西. XAML语法基础 1.  定义样式 <Window.Resources><!--窗体资源的定义--> < ...

  8. Unity3D游戏开发——Asset Server搭建

    本系列文章由 Amazonzx 编写,欢迎转载,转载请注明出处. http://blog.csdn.net/amazonzx/article/details/7980117 Asset Server是 ...

  9. Jar包下载

    到maven上面下载 http://mvnrepository.com/artifact/redis.clients/jedis/2.9.0 到jarfire去下载 http://cn.jarfire ...

  10. 微软职位内部推荐-Sr Development Lead-OSG-IPX

    微软近期Open的职位: Job Summary:Be part of Microsoft's strategy to deliver a great input experience across ...