zoukankan      html  css  js  c++  java
  • 洛谷 P1449 后缀表达式

    洛谷 P1449 后缀表达式

    洛谷传送门

    题目描述

    所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。

    如:3(5–2)+7对应的后缀表达式为:3.5.2.-7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。

    输入格式

    输入:后缀表达式

    输出格式

    输出:表达式的值

    输入输出样例

    输入 #1复制

    输出 #1复制

    说明/提示

    字符串长度,1000内。

    题解:

    铺垫知识:前、中、后缀表达式的构成及互相转换的原则。

    具体内容请参考这篇博客:

    浅谈前、中、后缀表达式

    其实,进行表达式转化的步骤一般有两种:表达式树和栈模拟。一般来讲,表达式树更适合笔试(代码非常恶心)。而我们正常的代码应该使用线性数据结构——栈。

    按照博客中的说法,应该建两个栈进行模拟。但是因为这道题没有运算优先级的前后,所以可以只建一个数字栈进行模拟。

    模拟的时候特别考验字符串的操作,细节部分在代码中已经给出:

    #include <bits/stdc++.h>
    using namespace std;
    stack<int> num;
    char ch;
    int sum,x,y;
    int main()
    {
        while((ch=getchar())!='@')
        {
            switch(ch)
            {
                case '+':
    			{
    				x=num.top();
    				num.pop();
    				y=num.top();
    				num.pop();
    				num.push(x+y);
    				break;
    			}
                case '-':
    			{
    				y=num.top();
    				num.pop();
    				x=num.top();
    				num.pop();
    				num.push(x-y);
    				break;
    			}
                case '*':
    			{
    				x=num.top();
    				num.pop();
    				y=num.top();
    				num.pop();
    				num.push(x*y);
    				break;
    			}
                case '/':
    			{
    				y=num.top();
    				num.pop();
    				x=num.top();
    				num.pop();
    				num.push(x/y);
    				break;
    			}
                case '.':
    			{
    				num.push(sum);
    				sum=0;
    				break;
    			}
                default :
    			{
    				sum=sum*10+ch-'0';
    				break;
    			}
            }
        }
        printf("%d",num.top());
        return 0;
    }
    
  • 相关阅读:
    WPF 重新启动该程序
    Winform水印
    PS 切HTML (ps+div+css)
    VS服务器运行有问题 怎么办?
    ISDeleted 软删除!!
    项目初始框架
    MD5加密
    !!LoginWindow.cs
    !!!精简版三层架构
    !!C#交互操作SqlServer数据库 基本的增删改查
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11698855.html
Copyright © 2011-2022 走看看