利用栈实现:中缀表达式转后缀表达式

利用栈实现:中缀表达式转后缀表达式题目 现有中缀表达式如 1 2 3 4 10 5 请用栈的特性编写一个程序 使得程序输出后缀表达式分析如下 STEP1 1 2 3 4 10 5 首先遇到第一个输入是数字 1 数字在后缀表达式中都是直接输出 接着是符号 入栈 STEP2 1 2 3 4 10 5 第三个字符是 依然是符号 入栈 接着是数字 2 输出 然后是符号 入栈 ST

题目:现有中缀表达式如:1+(2-3)*4+10/5

请用栈的特性编写一个程序,使得程序输出后缀表达式

分析如下:

STEP1:

1+(2-3)*4+10/5

STEP2:

1+(2-3)*4+10/5

第三个字符是“(”,依然是符号,入栈,接着是数字2,输出,然后是符号“-”,入栈:

利用栈实现:中缀表达式转后缀表达式

STEP3:

1+(2-3)*4+10/5

STEP4:

1+(2-3)*4+10/5

紧接着是符号“*”,直接入栈

利用栈实现:中缀表达式转后缀表达式

STEP5:

1+(2-3)*4+10/5

最后把刚刚的那个加号入栈,操作如下图:

利用栈实现:中缀表达式转后缀表达式

STEP6:

1+(2-3)*4+10/5

紧接着数字10,输出,最后是符号“/”,进栈:

利用栈实现:中缀表达式转后缀表达式

STEP7:

1+(2-3)*4+10/5

最后一个数字5,输出,所有的输入处理完毕,但是栈中仍然有数据,所以将栈中符号依次出栈。

总结规则:

从左到右遍历中缀表达式的每个数字和符号,若是数字则直接输出,若是符号,则判断其与栈顶符号的优先级,是右括号或者优先级低于栈顶符号,则栈顶元素依次出栈并输出,直到遇到左括号或栈空才将低优先级的那个符号入栈

代码实现如下:

#include <stdio.h> #include <stdlib.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 typedef char ElemType; typedef struct { ElemType *base; ElemType *top; int stackSize; }sqStack; InitStack(sqStack *s) { s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if( !s->base ) exit(0); s->top = s->base; s->stackSize = STACK_INIT_SIZE; } Push(sqStack *s, ElemType e) { // 栈满,追加空间,鱼油必须懂! if( s->top - s->base >= s->stackSize ) { s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType)); if( !s->base ) exit(0); s->top = s->base + s->stackSize; s->stackSize = s->stackSize + STACKINCREMENT; } *(s->top) = e; // 存放数据 s->top++; } Pop(sqStack *s, ElemType *e) { if( s->top == s->base ) return; *e = *--(s->top); // 将栈顶元素弹出并修改栈顶指针 } int StackLen(sqStack s) { return (s.top - s.base); } int main() { sqStack s; char c, e; InitStack( &s ); printf("请输入中缀表达式,以#作为结束标志:"); scanf("%c", &c); while( c != '#' ) { while( c>='0' && c<='9' ) { printf("%c", c); scanf("%c", &c); if( c<'0' || c>'9' ) { printf(" "); } } if( ')' == c ) { Pop(&s, &e); while( '(' != e ) { printf("%c ", e); Pop(&s, &e); } } else if( '+'==c || '-'==c ) { if( !StackLen(s) ) { Push(&s, c); } else { do { Pop(&s, &e); if( '(' == e ) { Push(&s, e); } else { printf("%c ", e); } }while( StackLen(s) && '('!=e ); Push(&s, c); } } else if( '*'==c || '/'==c || '('==c ) { Push(&s, c); } else if( '#'== c ) { break; } else { printf("\n出错:输入格式错误!\n"); return -1; } scanf("%c", &c); } while( StackLen(s) ) { Pop(&s, &e); printf("%c ", e); } return 0; } 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231638.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 13 RangeValidator

    13 RangeValidatorRangeValidator的属性有:MinimumValue:范围的最小值;MaximumValue:范围的最大值。Type:为数据类型,包括String,Intege,Double,Date,CurrencyRangeValidator,CompareValidator,RegularExpressValidator都不会对非空值进行校验,所…

    2022年7月12日
    22
  • MySQL TENSE

    MySQL TENSE

    2021年5月5日
    136
  • 决策树的原理_决策树特征选择

    决策树的原理_决策树特征选择决策树的原理:根据树结构进行决策,可以用于分类和回归。一颗决策树包括一个根结点、若干个内部节点和若干个叶节点。从根节点出发,对每个特征划分数据集并计算信息增益(或者增益率,基尼系数),选择信息增益最大的特征作为划分特征,依次递归,直至特征划分时信息增益很小或无特征可划分,形成决策树。决策树优点1.计算复杂度不高;2.输出结果易于理解;3.不需要数据预处理;4…

    2025年8月28日
    4
  • 股票软件受限解决方法[通俗易懂]

    股票软件受限解决方法[通俗易懂]现在很多内网都限制了股票软件的连接,WAYSONLINE除了游戏,股票软件也可代理,下面给大家分享一下具体使用。WaysonlineV3.0(以下简称V3)采用全新独创设计和高效编码,结合最新网络技术,已包含SocksCap/e-border/PSD等所有拦截功能,无需另外安装第三方软件,实现透明代理(类似VPN),即无需进行复杂的代理设置,即实现应用和游戏网络代理加速。

    2022年6月24日
    35
  • js算法初窥03(搜索及去重算法)

    前面我们了解了一些常用的排序算法,那么这篇文章我们来看看搜索算法的一些简单实现,我们先来介绍一个我们在实际工作中一定用到过的搜索算法——顺序搜索。1、顺序搜索其实顺序搜索十分简单,我们还是以第一篇

    2022年3月25日
    40
  • Dubbo(二)—dubbo支持的协议和注册中心

    Dubbo(二)—dubbo支持的协议和注册中心

    2020年11月12日
    235

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号