【栈】洛谷P1449 后缀表达式

    #include <iostream>
    #include <stack>
    using namespace std;
    int main(){
        stack<int>s;
        char t;
        while(cin>>t && t != ‘@‘){   //输入字符串t 当为@时结束
            if( t>=‘0‘ && t<=‘9‘){  //如果t是数字
                int a = t - ‘0‘;  //那么先把t赋值给a
                while(cin>>t && t>=‘0‘ && t<=‘9‘)  //因为a有可能是十位数百位数所用while循环判断 如果是的话 还得搞成十位或者百位
                    a=a*10+t-‘0‘; //上面要注意一点 记得要>= 否则会出错
                    s.push(a);//把算好的a直接入栈
            }
            if(t == ‘+‘){  //如果是t是+号  那么按照后缀表达式就将栈顶的两个元素拿出来进行运算
                int a = s.top();
                s.pop();
                int b = s.top();
                s.pop();
                s.push(b+a);
            }
            if(t == ‘-‘){
                int a = s.top();
                s.pop();
                int b = s.top();
                s.pop();
                s.push(b-a);
            }
            if(t == ‘*‘){
                int a = s.top();
                s.pop();
                int b = s.top();
                s.pop();
                s.push(b*a);
            }
            if(t == ‘/‘){
                int a = s.top();
                s.pop();
                int b = s.top();
                s.pop();
                s.push(b/a);
            }
        }
        cout<<s.top();  //最后栈顶剩下来的一定会是运算结果
        return 0;
    }

代码实现

这个题,首先你得了解后缀表达式的含义。

如果输入数字就入栈,如果是运算符号就出栈两个元素进行运算,运算完毕后再把结果入栈。

一定不会出现只有一个元素就出现运算符号的情况。(拿中缀表达式来说 运算符左右必须有两个数字一样)

这里代码实现的时候,只考虑数字,如果是数字就入栈。但因为有可能数字的两位到三位甚至四位的话,那么就得求和。 这里只是把“.”当做了一个标志

如果遇到运算符直接出栈两个元素然后进行运算!

附上 后缀表达式与栈的关系讲解链接:http://www.nowamagic.net/librarys/veda/cate/DataStructures

时间: 2024-08-06 21:38:45

【栈】洛谷P1449 后缀表达式的相关文章

洛谷P1449 后缀表达式 栈 模拟 字符串

洛谷P1449 后缀表达式 栈 模拟 字符串 栈模拟一下 碰到 . 如果输入的是数字就把数字放进栈中 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdlib> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip> 8 #include <io

洛谷P1449——后缀表达式(栈模拟)

题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.[email protected].'@'为表达式的结束符号.'.'为操作数的结束符号. 输入输出格式 输入格式: 输入:后缀表达式 输出格式: 输出:表达式的值 输入输出样例 输入样例#1: 3.5.2.-*[email protected] 输出样例#1: 1

洛谷 P1449 后缀表达式

题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.[email protected].’@’为表达式的结束符号.‘.’为操作数的结束符号. 输入输出格式 输入格式: 输入:后缀表达式 输出格式: 输出:表达式的值 输入输出样例 输入样例#1: 3.5.2.-*[email protected] 输出样例#1: 1

洛谷 P1449 后缀表达式 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1449 题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.[email protected].’@’为表达式的结束符号.‘.’为操作数的结束符号. 输入输

洛谷 P1449 后缀表达式 Label:表达式计算系列

题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.[email protected].’@’为表达式的结束符号.‘.’为操作数的结束符号. 输入输出格式 输入格式: 输入:后缀表达式 输出格式: 输出:表达式的值 输入输出样例 输入样例#1: 3.5.2.-*[email protected] 输出样例#1: 1

[题解]P1449 后缀表达式

[题解]P1449 后缀表达式(栈) 题目链接:P1449 后缀表达式 题目描述: 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3(5–2)+7对应的后缀表达式为:3.5.2.-7.[email protected].'@'为表达式的结束符号.'.'为操作数的结束符号. 输入格式:输入:后缀表达式 输出格式:输出:表达式的值 输入输出样例: 输入 #1 3.5.2.-*[e

九、运用栈的知识对后缀表达式的运算方式进行表达

前言:中缀表达式符合人们的阅读习惯:  如:5+3 后缀表达式符合计算机的运算习惯:如:53+ 现在运用栈的知识对后缀表达式的运算方式进行表达 1.LinkList.h #ifndef _LINKLIST_H_ #define _LINKLIST_H_ typedef void LinkList; typedef struct _tag_LinkListNode LinkListNode; struct _tag_LinkListNode { LinkListNode* next; }; Lin

栈应用2-无括号后缀表达式

将算数表达式a+b+c*d转换成后缀表达式ab+cd*+,就可以利用栈来实现这种有优先级的运算,因此首先可以使用栈来将一种表达式转化成对应的后缀表达式. 下面是实现的转换算法,注意不能带括号,支持+-*/运算符,stack的实现我可以去掉了错误检测,因为默认已经声明好了足够大小的栈. 栈头文件stack.h 1 /*数组栈*/ 2 #include "iostream" 3 #include "stdlib.h" 4 5 #define minSize 5 6 #d

P1449 后缀表达式

题目链接 题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.[email protected].’@’为表达式的结束符号.‘.’为操作数的结束符号. 输入输出格式 输入格式: 输入:后缀表达式 输出格式: 输出:表达式的值 输入输出样例 输入样例#1: 复制 3.5.2.-*[email protected] 输