前、中、后缀表达式求值与栈

栈实现表达式求值(C语言) 刚刚学习C语言的时候很多人就写过计算器,但是当时写的计算器只能进行一步四则运算;对于一次输入(1+2)*3+4这样的运算则没有办法计算。 本篇博文利用栈这种数据结构实现了支持带括号的表达式求值计算器;栈有栈底和栈顶指针,元素是先进后出;对于栈的操作最主要的是创建、压栈、弹栈;在实现计算器时,我们输入的表达式叫做中缀表达式,我们需要将其转为后缀表达式;然后利用后缀表达式求取表达式的值; 阅读详情

1.首先弄清前缀、中缀、后缀表达式的含义

<1>
中缀表达式即运算符处在两个操作数的中间,该表达式广泛运用于日常,需要人主观进行判断运算符的优先级,不易被机器识别。

<2>
前缀表达式即将运算符写在前面,没有括号的表达式,为纪念波兰籍发明者,也称为波兰式。
虽然将中缀改为前缀之后,表达式的求值可以化简成入栈和出栈两个操作,但较于后缀表达式还是比较复杂。

<3>
后缀表达式即将运算符写在后面,也称为逆波兰式,因为运算顺序就是从左到右运算符出现的顺序,所以操作最简单。

2.中缀表达式的运算逻辑
<1>
分清优先级。
先计算括号内,后计算括号外
在无括号或同层括号类,乘除运算的优先级高于加减运算的优先级
同一优先级运算,从左向右依次进行

<2>
使用两个工作栈,一个存放运算符,一个存放操作数
操作数直接入栈
运算符则与运算栈的栈顶元素比较优先级
⑴若该运算符的优先级更高,则直接入栈
⑵若该运算符的优先级更低,则运算栈的栈顶运算符依次退栈直到左括号或结束⑶若两运算符同级,说明左右括号相遇,左括号此时应该可以直接退栈

<3>
需要进行很多次的条件判断,逻辑有点不清晰,什么时候运算符入栈,什么时候出栈、括号的问题无法很好的处理,不能直接一次解决,又感觉要嵌到许多种情况里判断,最后也无法对整体有一个完整性的把握,无法确定算法处理好了所有可能的情况,无法对结构有清晰的判断。在复杂的逻辑判断的锻炼上还要加强,中缀表达式的直接判断就放弃了,知道转后缀和后缀的计算也行。

3.中缀表达式转后缀表达式
在表达式中存在操作数、小数点、运算符、括号和最后的等号。
需要一个存储后缀表达式的字符数组,和一个存储运算符的字符栈

<1>
表达式实际是存储在字符串中,因此首先要处理操作数的读入。
如果是操作数,直接存入后缀表达式的字符数组中。包括多位数和小数位。

<2>
然后处理括号。
如果是左括号,直接入栈然后处理下一个字符。
如果是右括号,说明左右括号中间的计算完成,将栈顶元素依次退栈存储到字符数组中,直到栈顶元素变为左括号,然后再次退栈,继续下一个字符。

<3>
然后是运算符,首先要确定优先级。可以直接量化,假设
‘=’、‘(‘、’)’的优先级是0
‘+’、‘-’的优先级是1
‘*’、‘/’的优先级是2
当读入的字符是一个运算符时,将它与栈顶元素比较,

如果它的优先级大于栈顶元素,
说明它前面一个操作数要先和它后面一个操作数做该运算,因此直接入栈。

如果它的优先级小于等于栈顶元素,
说明它前面一个数是和这个数前面一个数进行运算的。
所以栈顶元素退栈存入字符数组,然后再将该运算符和新的栈顶元素进行比较。(即一直要退栈顶元素到当前运算的优先级高时入栈)
(在一开始运算栈应该要初始化一个优先级为0的元素,显然如果栈顶元素为该元素,说明当前判断运算符之前的运算已经全部完成,就可以直接入栈)

<4>
最后的’=’直接加上就好,这样一来所有的字符就都能够处理好,并且通过条件判断非常清晰。

//NOJ467题实现代码

#include <iostream>
#include <cstdio>
#include <ctype.h>
using namespace std;

char f(char a,char b)
{
    int aa;int bb;
    if(a=='='||a=='('||a==')') aa=0;
    else if(a=='+'||a=='-')   aa=1;
    else if(a=='*'||a=='/')   aa=2;
    if(b=='='||b=='('||b==')') bb=0;
    else if(b=='+'||b=='-')   bb=1;
    else if(b=='*'||b=='/')   bb=2;

    if(aa>bb)  return '>';
    else if(aa==bb)  return '=';
    else if(aa<bb)   return '<';
}

int main()
{
    int s;cin>>s;
    int t=0,h=0;
    while(s--)
    {

        char S[1000];//栈 
        S[0]='=';int top=0;
        char expresion[2000],str[5000];
        cin>>expresion;
        int i=0;int j=0;
        while(expresion[i]!='\0')
        {
            if(isdigit(expresion[i])||expresion[i]=='.')
            {
                if(expresion[i+1]=='.'||isdigit(expresion[i+1]))
                {
                    str[j++]=expresion[i++];
                }
                else{
                    str[j++]=expresion[i++];
                    str[j++]=' ';
                }
            }
            //处理完操作数和小数点,处理括号
            else if(expresion[i]=='(')
            {
                S[++top]=expresion[i];
                i++;
            }
            else if(expresion[i]==')')
            {
                while(S[top]!='(')
                {
                    str[j++]=S[top];
                    str[j++]=' ';
                    top--;
                }
                top--;i++;
            }
            //处理完括号处理最后的等于 
            else if(expresion[i]=='=')
            {
                while(S[top]!='=')
                {
                    str[j++]=S[top];
                    str[j++]=' ';
                    top--;
                }
                str[j++]='=';str[j]='\0';
                break;
            }
            //最后剩下运算符
            else
            {
                switch(f(expresion[i],S[top]))
                {
                    case '>':S[++top]=expresion[i++];break;
                    case '=':
                    case '<':
                    {
                        while(f(expresion[i],S[top])!='>')
                        {
                            str[j++]=S[top];
                            str[j++]=' ';
                            top--;
                        }
                        S[++top]=expresion[i++];break;
                    }
                }
            } 

        } 
        int t=0;
        while(str[t]!='\0')
        {
           cout<<str[t];
           str[t++]='\0';
        }
        cout<<endl;
    }
}         

4.前、后缀表达式的求值

后缀表达式的计算逻辑非常简单。
如果是操作数,就入栈。
如果是运算符,就将栈顶最上方两个元素出栈进行运算(注意顺序),然后将结果入栈。(退2进1)

而如果是前缀表达式的求值,本来是从右向左扫描,是操作数就入栈,是运算符就取栈顶两元素运算。
但实际上将字符串反序,就和后缀表达式的计算基本一样,(差别主要是顺序和操作数在字符串中的处理)
贴一道计算10以内前缀表达式的代码

//NOJ128题实现代码

#include <iostream>
#include <iomanip>
#include <cstdio>
using namespace std;

double Stack[510];  //操作数栈 


//字符串s2反序存储到s1 
void strdeal(char *s1,char *s2)
{
    int i=0;
    while(s2[i]!='\0')i++;  //出循环s2[i]=0
    int j=0;i--;
    while(i>=0)
    {
        s1[j]=s2[i];
        j++;i--;
    } 
    s1[j]='\0';
} 

int main()
{
    char str[2000];
    while(gets(str))   //完成输入 
    {
        //反序
        char s[2000];
        strdeal(s,str);   //实现 s为待处理字符串 
        int i=0;
        int top = -1;       //栈顶指针 
        int tag = 0 ;

        while(s[i]!='\0')
        {
            if(isspace(s[i]))   tag=0;   //空格           
            if(tag==1&&s[i]!='.')
            {
                Stack[top]=Stack[top]/10;
                Stack[top]+=s[i]-'0';
            }

            else if(isdigit(s[i])) 
            {
                tag=1;
                Stack[++top]=s[i]-'0';
            }

            else
            {
                switch(s[i])
                {
                    case '+' :
                       Stack[top-1]=Stack[top]+Stack[top-1];
                       Stack[top--]=0;break;
                    case '-' :
                       Stack[top-1]=Stack[top]-Stack[top-1];
                       Stack[top--]=0;break;
                    case '*' :
                       Stack[top-1]=Stack[top]*Stack[top-1];
                       Stack[top--]=0;break;
                    case '/' :
                       Stack[top-1]=Stack[top]/Stack[top-1];
                       Stack[top--]=0;break;
                    default:break;
                }
            } 
            i++;    
        }
        cout<<setprecision(2)<<setiosflags(ios::fixed);
        cout<<Stack[top]<<endl;
    }
}

5.中缀表达式转后缀进行求值
结构中缀转后缀,和后缀表达式的算法,就可以实现中缀表达式的求值了。
贴一道中缀表达式求值的代码

//NOJ35题实现代码

#include <iostream>
#include <ctype.h>
#include <iomanip>
using namespace std;

char f(char a,char b)
{
    int aa;int bb;
    if(a=='='||a=='('||a==')') aa=0;
    else if(a=='+'||a=='-')   aa=1;
    else if(a=='*'||a=='/')   aa=2;
    if(b=='='||b=='('||b==')') bb=0;
    else if(b=='+'||b=='-')   bb=1;
    else if(b=='*'||b=='/')   bb=2;

    if(aa>bb)  return '>';
    else if(aa==bb)  return '=';
    else if(aa<bb)   return '<';
}

int main()
{
    int s;cin>>s;
    while(s--)
    {
        char expresion[1010],S[100],str[2010];
        S[0]='=';int top=0;
        cin>>expresion;int i=0,j=0;
        while(expresion[i]!='\0')
        {
            if(isdigit(expresion[i])||expresion[i]=='.')
            {
                if(expresion[i+1]=='.'||isdigit(expresion[i+1]))
                     str[j++]=expresion[i++];
                else{ str[j++]=expresion[i++];
                      str[j++]=' ';}
            }//处理完操作数和小数点,处理括号
            else if(expresion[i]=='(')
                S[++top]=expresion[i++];
            else if(expresion[i]==')')
            {
                while(S[top]!='(')
                {
                    str[j++]=S[top];
                    str[j++]=' ';
                    top--;
                }
                top--;i++;
            }//处理完括号处理最后的等于 
            else if(expresion[i]=='=')
            {
                while(S[top]!='=')
                {
                    str[j++]=S[top];
                    str[j++]=' ';
                    top--;
                }
                str[j++]='=';str[j]='\0';
                break;
            }//最后剩下运算符
            else
            {
                switch(f(expresion[i],S[top]))
                {
                    case '>':S[++top]=expresion[i++];break;
                    case '=':
                    case '<':{
                                 while(f(expresion[i],S[top])!='>')
                                {
                                    str[j++]=S[top];
                                    str[j++]=' ';
                                    top--;
                                }
                                S[++top]=expresion[i++];break;
                             }
                }
            } 
        }//str存储了后缀表达式,最后以=收尾 

        double Stack[1010];//操作数栈,接下来进行存数
        i=0;top=-1;int tag=0;int t;//小数位t 
        while(str[i]!='\0')
        {
            if(isdigit(str[i]))
            {
                if(tag==2)
                {
                    double temp=str[i]-'0';
                    int tt=t;
                    while(tt--)
                       temp=temp/10; 
                    Stack[top]+=temp;
                    t++;i++;
                }
                else if(tag==1)
                {
                    Stack[top]=Stack[top]*10+str[i]-'0';
                    i++;
                }
                else if(tag==0)
                {
                    Stack[++top]=str[i]-'0';
                    tag=1;i++;
                }
            }
            else if(str[i]=='.')
            {
                tag=2;t=1;i++;
            }
            else if(isspace(str[i]))
            {

                tag=0;i++;
            }
            else
            {
                switch(str[i++])
                {
                    case '+':Stack[top-1]=Stack[top-1]+Stack[top];S[top--]=0;break;
                    case '-':Stack[top-1]=Stack[top-1]-Stack[top];S[top--]=0;break;
                    case '*':Stack[top-1]=Stack[top-1]*Stack[top];S[top--]=0;break;
                    case '/':Stack[top-1]=Stack[top-1]/Stack[top];S[top--]=0;break;
                    case '=':break;
                }
            }
        }
        cout<<setprecision(2)<<setiosflags(ios::fixed);
        cout<<Stack[top]<<endl;

        while(str[i]!='\0')
        str[i++]='\0';

    }
}         

6.过程逻辑与栈的运算
以前处理的问题简单的时候,总是想一想,过程基本就那样几个步骤,一两个条件判断,一两个循环操作,很清晰。
但是当一个问题不是靠着一条路就穿到结尾,而是结构复杂要考虑相互影响的时候,就需要非常清晰有条理的思路了,这大概就是所谓逻辑思维的体现吧,怎么考虑问题的各个层次才可以不漏情况,怎么把问题先抽象成几个步骤然后在分块去实现,这些还要加强。
对于栈,有句在论坛看到的感觉很贴切
“以前我一直以为栈是一种数据结构,但是我做了**题后,才觉得,栈其实是一种思想。”

【c++】后缀表达式求值(详解) 后缀表达式的介绍和详细代码实现,计算逆波兰表达式的结果,用C++实现 阅读详情

相关推荐

常用数据结构栈的应用—-表达式求值

常用数据结构栈的应用—-表达式求值 常用数据结构栈的应用-表达式求值 栈 表达式求值 后缀表达式求值 中缀表达式转后缀表达式 代码示例栈 栈是常用的数据结构,栈又称堆栈,是一种受限的线性表。其限制是允许在表中的一端进行插入和删除元素。栈中的元素符合后进先出(FILO)的性质。允许插入和删除元素的一端被称为栈顶,另一端被称为栈底。 栈有两种关键的操作,分别为出栈和压栈。 栈有两种关键的操作,

Spground 1万+

算法竞赛入门经典——C++与STL入门

算法竞赛入门经典——C++与STL入门 C++在string头文件里定义了string类型,直接支持流式读写。string有很多方便的函数和运算符,但速度有些慢。 考虑这样一个题目:输入数据的每行包含若干个(至少一个)以空格隔开的整数,输出每行中所有整数之和。如果只能使用字符与字符数组,一般由两种方案:一是使用getchar()边读边算,代码较短,但容易写错,并且相对较难理解;二是每次读取一行,然...

linjiayina的博客 799

USB3.0/3.1信号完整性分析仿真

• 1.了解USB3.0通路的互连关系,解读原理图接口电路和PCB的互连电路。对USB布线的通路及阻抗进行检查和分析。 • 2.使用USB3.0实例文件提取互连线的S参数,选择SSRX+,SSRX-,SSTX+,SSTX-,D+,D-组的互连线,使用PowerSI,Clarity,3DFEM等工具提起关键网络的S参数。提取S参数以后需要分析S参数的互连特征,对S参数的结果开展评价。 • 3.使用SYSTEM SI USB3 Compliance工程向导模型,建立USB仿真实例框架,在框架BOLCK中带入S参

小猪配齐电子设计 1万+

C++数据结构与STL--栈的应用--后缀表达式的计算

1.后缀表达式:运算符出现在其运算数之后   Example:    中缀:a+b*c                      后缀:abc*+    中缀:(a*b+c)/d+e            后缀:ab*c+d/e+   2.后缀表达式计算       *从左到右扫描后缀表达式的每一项,用一个栈装载运算数,如果是运算数将其推入栈       *如果是二元运算符,则出

piniheaven的专栏 1505

界面上下固定_基于ANSYS的胶粘结构界面开裂有限元计算

引言:目前工程上主要有螺栓,过盈,焊接和胶粘四种常用的连接方式,本文基于ANSYS Workbench环境,引入内聚力模型来实现对胶粘结构界面开裂失效的计算,文中的界面失效参数为随意给定,不是工程实际测试数据,仅起到演示作用!1.问题的描述如图所示给出了胶粘结构的三维模型,该胶粘结构由上下钢板组成,中间通过胶粘接到一起。(胶不需要建模,其影响主要通过内聚力模型实现)上下板的材料为结构钢,...

weixin_29473667的博客 1万+

AI Olympics:面向真实决策的不完全信息博弈评测框架

在人工智能落地实践中,传统基准测试(如MMLU、GSM8K)擅长评估知识调用与静态推理能力,却难以衡量模型在动态、模糊、高代价的真实场景中的策略决策水平。AI Olympics正是为弥补这一断层而生——它以扑克、狼人杀等社会性博弈为载体,系统考察模型在不完全信息下的对手建模、欺骗检测、多步序贯推理与代价敏感执行等核心能力。其技术价值在于将‘黑箱决策’转化为可追踪、可归因、可压力测试的动态思维图谱(DTG),支撑金融风控、智能客服、交通调度等强交互业务场景的能力诊断与持续优化。

weixin_30983965的博客 298

[数据结构与算法]第5章 栈

[TOC] 5.1 栈实现综合计算器(中缀表达式) 思路分析 代码实现 public class Calculator { public static void main(String[] args) { String expression = "7*2*2-5+1-5+3-4"; // 15//如何处理多位数的问题? //创建两个栈,数栈,一个符号栈 ArraySta...

qq_43115606的博客 2891

Maven的下载安装配置教程(详细图文)

目录 一、简单了解一下什么是Maven 二、maven的下载 三、maven的安装 四、maven的环境变量配置 五、setting文件配置 六、开发工具配置Maven 一、简单了解一下什么是Maven Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。 1.Maven翻译为“专家“, ”内行”的意思,是著名Apache公司下基于Java开发的开源项目。 2.Maven项目对象模型(POM)是一..

bakelFF的博客 12万+

使用栈实现表达式的计算前缀、中缀、后缀表达式(逆波兰表达式)

前缀表达式的计算机求值 从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈项元素和次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。 例如: (3+4)X5-6 对应的前缀表达式就是 - X + 3 4 5 6 ,针对前缀表达式求值步骤如下:

共勉 3264

Python抓取摄像头图像,进行AI识别(一)

本文介绍了如何用Python获取海康威视摄像头的图像并进行AI识别。主要内容包括:1)准备工作,包括摄像头IP设置和密码重置方法;2)使用Python的Requests库通过ISAPI接口获取实时图像;3)示例代码展示如何保存摄像头图像。整个过程为后续AI图像识别提供了基础,通过简单的Python代码即可实现专业监控设备的图像采集功能。

Hahafantuan的博客 1514

基于物联网技术智慧园林绿化养护管理信息平台

近几年来,随着经济不断的发展,城市面积不断的扩大,城市管理中的园林绿化工作也在这种趋势下不断的发生着深刻改变。管养企业是否按制定的管养计划严格执行?绿化事件整改是否及时到位?绿地面积是否在稳步增长?管养的效果如何?如何客观评价管养企业的管养工作?这些都是我们各级管理者需要面对的问题。   智慧园林绿化养护管理信息平台的开发思路以“考核”为核心,整个信息平台体现出“新、快、高、全、享”五个特点。   智慧园林绿化养护管理信息平台的整个开发理念为:依托五大技术手段(全球卫星定位系统技术、地理信...

Cesium的博客QQ2252224326 2459

栈的应用(二)-在前缀(后缀)表达式中求值

1. 后缀表达式(逆波兰表达式) 运算符在两个操作数后面 中缀转后缀的手算方法: (1)确定中缀表达式的各个运算符的运算顺序 (2)选择下一个运算符,按照【左操作数 右操作数 运算符】的方式组合成一个新的操作数 (3)如果还有运算符没被处理,就继续(2) 注意:由于运算顺序不唯一,因此对应的后缀的表达式也不唯一 但对于计算机来进行转化的话,只会产生第一种结果,因为算法的确定性,一种输入只能产生一种输出。 计算机中缀转后缀的原则:左优先原则。 左优先原则:只要左边的运算符能先计算,就优先算左边的。 后缀表

qwe954443563的博客 1090

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

bfq05234214的博客 441

表达式求值和前中后缀表达式 划重点

表达式求值 算法思路: 1.设立操作数栈和运算符栈; 2.设表达式的结束符为“#”,预设运算符的栈底为“#” 3.若当前字符为操作数,则直接压入操作数栈 4.若当前字符是运算符,且运算符额优先级高于栈顶运算符则进栈,否则,从操作数栈中弹出运算符栈的栈顶运算符,经计算后将结果压入操作数栈。 1.设立操作数栈和运算符栈;2.运算示例 3*2+5 1. 2. ...

theflybrid的博客 300

Win7/10/11文件拖拽导致资源管理器闪退问题

最近老是遇到把文件从资源管理器拖动到微信或者浏览器时,资源管理器直接闪退的问题,一开始在公司遇到了还以为是电脑配置太低,直到被封闭在家办公,发现自己的高级电脑也有这个问题,那就来了解了解问题是出在什么地方把。

Nicer_feng's blog 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

数据结构与算法(4)—— 栈的应用

栈的应用 1、括号匹配 假设有两种括号,一种圆的(),一种方的[],嵌套的顺序是任意的。 算法思想:若是左括号,入栈;若是右括号,出栈一个左括号判断是否与之匹配;检验到字符串尾,还要检查栈是否为空。只有栈空,整个字符串才是括号匹配的。 代码 #include<string> #include<stack> #include<iostream> using namespace std; bool MatchBrackets(char* pStr) { stack

weixin_45418001的博客 383

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

代码随想录第10天:(栈与队列2)

杰克今天学习栈与队列2

weixin_70587313的博客 1044

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

代码随想录算法Day10|(栈与队列part2)150. 逆波兰表达式求值 、239. 滑动窗口最大值、347.前 K 个高频元素

滑动窗口队列前k个元素直接添加,找到返回数组的第一个值,然后开始滑动,进行add()、poll()的操作,并调用peek()获取每次的最大值赋给返回数组。比如:对于窗口里的元素{2, 3, 5, 1 ,4},单调队列里只维护{5, 4} 就够了,保持单调队列里单调递减,此时队列出口元素就是窗口里最大元素。其实队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。1)实现小顶堆,元素类型为长度为2数组,放元素和元素出现次数。

weixin_43875767的博客 1164

代码随想录第十天:后缀表达式、滑动窗口最大值、前k个高频数字

代码随想录第十天:后缀表达式、滑动窗口最大值、前k个高频数字

qq_39962113的博客 1403

代码随想录算法训练营第十一天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素、栈与队列总结

代码随想录。

2301_80082921的博客 742

算法训练营第十天 | 栈与队列(二)

原文链接:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE。在排序的过程中,我们使用优先级队列,key为数字,value为出现的次数,最后返回即可。的滑动窗口从数组的最左侧移动到数组的最右侧。的队列,不断的进行出队和入队操作,同时记录队中的最大值。

Nayut_的博客 825

第3章 栈和队列的应用

一、栈的应用 1.括号匹配 2.表达式求值 见这篇博文 “栈”的典型应用—表达式求值(C语言实现) 后缀表达式计算值: 顺序扫描后缀表达式。1.遇到数字,压栈;2.遇到运算符连续出栈两次F2,F1,计算F2<OP>F1后,压栈;3.循环前面两步,最后的结果在栈顶。(F1代表第一个出栈的数,F2代表第二个出栈的数) 后缀表达式求值实例:后缀表达式:3 4 + 5 * 6 - [解]顺序扫描

sagittarius_yx的专栏 473

算法训练Day11/栈与队列

若遇见操作符,则从栈中弹出两个数字,先出栈的是右操作数,后出栈的是左操作数,运算完后将结果压入操作栈,继续遍历直至表达式末尾。给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。输入:tokens = ["4","13","5","/","+"]输入:tokens = ["2","1","+","3","*"]• 有效的算符为 '+'、'-'、'*' 和 '/'。

m0_75208478的博客 284

STL之stack的应用——前中后表达式转换、求值

一、stack基础知识 1、stack基本操作 #include <iostream> #include <algorithm> #include <stack> using namespace std; int main () { stack<int> s; // 创建栈 int sum (0); s.push(i); // 入栈 while (!s.empty())// 判断栈是否为空 { sum += s.top()

uu_77的博客 3105

C语言栈的应用——后缀表达式求值

算法思路 ​ 上次已经完成了由中缀表达式转后缀表达式的算法,而后缀表达式的优点就是可以从左至右直接读取,没有算数优先级的考量,所以直接进行运算即可。 ​ 该算法需要使用一个栈用来保存操作数,在读取到数字的时候,将数字压入栈中;如果读取到操作符,就弹出栈顶的两个元素,分别为op2和op1(先弹出来的元素为op2),将op1和op2与目前读取到的操作符进行计算,并将结果压回栈中。反复运行直到后缀表达式全部读取完成,此时栈中的结果即后缀表达式的结果。 具体过程 例后缀表达式12+3-45*2/+,定义一个栈num

那么大圆筒的博客 7312

后缀表达式的求值的算法

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE

xiaoniba1024的专栏 4万+
上一篇: 循环链表的实现
下一篇: 秋招准备-算法-排序(总)
LLLLLin0
博客等级 码龄11年 17粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值