【数据结构入门训练DAY-18】信息学奥赛一本通T1331-后缀表达式的值

文章目录

前言

本次训练内容:

  1. 栈的复习。
  2. 栈模拟四则运算计算问题的练习。
  3. 训练解题思维。

一、题目

从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加(+)、减(---)、乘(*)、除(/)四种运算符。每个运算数之间用一个空格隔开,不需要判断给你的表达式是否合法。以@作为结束标志。比如,16--9*(4+3)转换成后缀表达式为:16□9□4□3□+*--,运行结果:-47。提示:输入字符串长度小于250,参与运算的整数及结果之绝对值均在2^64范围内,如有除法保证能整除。

输入格式

一个后缀表达式。

输出格式

一个后缀表达式的值。

样例输入

复制代码
16 9 4 3 +*-@

样例输出

复制代码
-47

二、解题思路

这道题目是让我们把字符串中的数字存入栈中,然后从后面的'+-*/'的顺序依次进行计算,出现'@'是结束。我的思路是创建两个栈s,s1和对应的字符串,然后通过定义一个指针i去遍历字符串,把字符串中的数字元素存入s;每当遇到空格时,就先处理位数问题,位数处理就是定义两个变量作为指针给它初始值进行位运算,然后开始压入s1,每次操作一遍后要更新重置对应的两个指针。然后依次判断i指向的运算符是什么,并计算。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int main() {
    stack<char> s;
    stack<int>s1;//定义两个不同的栈
    int m=0,n=1;//定义位运算的变量作为指针
    int a,b;//定义指向运算时要出栈的两个元素的指针
    string str;
    getline(cin,str);
    for (auto i:str) {//智能指针法遍历
        if (i == '@') {//判断是否为结束符'@'
            break;
        }
        if (i>='0'&&i<='9') {//判断字符串的数字并存入s中
            s.push(i);
        }
        else if (i==' ') {//当到空格符时对栈中的元素进行位运算
            while (!s.empty()) {
                m=m+(s.top()-'0')*n;
                s.pop();
                n=n*10;
            }
            s1.push(m);//位运算结束后压入新栈
            m=0;
            n=1;
        }
        //对运算符进行对应的运算
        if (i == '+') {
            a=s1.top();
            s1.pop();
            b=s1.top();
            s1.pop();
            s1.push(a+b);
        }
        if (i == '-') {
            a=s1.top();
            s1.pop();
            b=s1.top();
            s1.pop();
            s1.push(b-a);
        }
        if (i == '*') {
            a=s1.top();
            s1.pop();
            b=s1.top();
            s1.pop();
            s1.push(a*b);
        }
        if (i == '/') {
            a=s1.top();
            s1.pop();
            b=s1.top();
            s1.pop();
            s1.push(b/a);
        }
    }
    cout<<s1.top()<<endl;//计算最终结果
}

因为题目的数据有正负和运算顺序的要求,所以需要保证进行减法和除法运算时,对应的变量位置书写正确。

总结

今天的题目是一道经典的栈的操作复习题,今天的题目结束后,明天最后写一道进阶题,栈的复习题就全部完成了,栈的作用还是挺重要,运用的范围还是挺广的,所以练习的时间比较长,如昨天总结的括号匹配问题和今天的后缀表达式问题都是栈的学习中十分经典的问题,希望后面写到类似的问题都能快速解答。

相关推荐
季明洵16 分钟前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
shandianchengzi20 分钟前
【小白向】错位排列|图文解释公考常见题目错位排列的递推式Dn=(n-1)(Dn-2+Dn-1)推导方式
笔记·算法·公考·递推·排列·考公
I_LPL21 分钟前
day26 代码随想录算法训练营 回溯专题5
算法·回溯·hot100·求职面试·n皇后·解数独
Yeats_Liao22 分钟前
评估体系构建:基于自动化指标与人工打分的双重验证
运维·人工智能·深度学习·算法·机器学习·自动化
only-qi24 分钟前
leetcode19. 删除链表的倒数第N个节点
数据结构·链表
cpp_250126 分钟前
P9586 「MXOI Round 2」游戏
数据结构·c++·算法·题解·洛谷
浅念-30 分钟前
C语言编译与链接全流程:从源码到可执行程序的幕后之旅
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
爱吃生蚝的于勒42 分钟前
【Linux】进程信号之捕捉(三)
linux·运维·服务器·c语言·数据结构·c++·学习
有时间要学习1 小时前
面试150——第五周
算法·深度优先
数智工坊2 小时前
【数据结构-树与二叉树】4.6 树与森林的存储-转化-遍历
数据结构