中缀表达式转化为后缀表达式(栈思想)
发布日期:2021-11-15 21:44:13 浏览次数:2 分类:技术文章

本文共 1888 字,大约阅读时间需要 6 分钟。

例题:

数据结构实验之栈与队列二:一般算术表达式转换成后缀式

Problem Description

对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。

Input

输入一个算术表达式,以‘#’字符作为结束标志。

Output

输出该表达式转换所得到的后缀式。

Sample Input

ab+(c-d/e)f#

Sample Output

abcde/-f+

代码展示:

#include
using namespace std;int judge(char a,char b){
if(b=='(') {
return 1; } else if((a=='%'||a=='*'||a=='/')&&(b=='+'||b=='-')) {
return 1; } else return 0;}int main(){
char a[10000]; scanf("%s",a); int n=strlen(a); stack
q; int i; for(i=0;i
='a'&&a[i]<='z') {
printf("%c",a[i]); } else if(a[i]=='#') {
while(!q.empty()) {
printf("%c",q.top()); q.pop(); } } else {
if(q.empty()) {
q.push(a[i]); } else {
if(a[i]=='(') q.push(a[i]); else if(a[i]==')') {
while(q.top()!='(') {
printf("%c",q.top()); q.pop(); } q.pop(); } else if(judge(a[i],q.top())>0) {
q.push(a[i]); } else {
printf("%c",q.top()); q.pop(); q.push(a[i]); } } } } return 0;}

步骤说明:

在这里插入图片描述
举例说明

a*(b+c)/d 转化为后缀表达式为:abc+*d/

变化过程为:

1、碰到运算数a就输出;在这里插入图片描述

2、碰到 * 号放入栈在这里插入图片描述
3、碰到左括号,左括号的优先级比*号的优先级高,so把左括号放进栈中;在这里插入图片描述
4、碰到运算数b,直接输出;在这里插入图片描述
5、当左括号放进栈中的时候,优先级降到最低,so+号的优先级比左括号高,放进栈中,并把c输出;
在这里插入图片描述
6、当碰到右括号的时候,把栈顶的元素以此依次输出知直到碰到左括号结束,把左括号从栈中删除;在这里插入图片描述
7、碰到 / 号,除法的优先级和乘法相同,但是要按照从左到右的原则,so输出 * ,把 / 号放进栈中;然后输出运算数d;
在这里插入图片描述
8、运算截止,把栈中的所有元素全部输出;
在这里插入图片描述
时间复杂度: O(n)

转载地址:https://blog.csdn.net/qq_43419016/article/details/97813669 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:栈和队列函数的基本操作(c++)
下一篇:优先队列priority_queue的使用说明(c++)

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月21日 16时13分06秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章