C++ 利用栈解决运算问题

第一步需要将中缀表达式转为后缀表达式。这步的转化可以说是本题的核心。

主要的转化手段是利用栈,有如下几个规则:

  • 数字直接输出
  • "("直接进栈
  • ")"将栈中元素出栈直到遇到"("
  • 其他运算符需要和栈顶元素比较优先级,如果栈顶元素的优先级小于等于待操作的运算符的,则需要出栈并输出。直到栈顶元素的优先级大于待处理元素
  • 最后需要将栈中元素清空,全部输出
int toint(string in)
{
    int rst;
    stringstream ss;
    ss<<in;
    ss>>rst;
    return rst;
}

int priority(char a)
{
    switch(a)
    {
    case ‘*‘: return 2;
    case ‘/‘: return 2;
    case ‘+‘: return 1;
    case ‘-‘: return 1;
    case ‘(‘: return 3;
    case ‘)‘: return 3;
    }
}

bool isdig(char a)
{
    if(a>=‘0‘&&a<=‘9‘) return true;
    else return false;
}

//保证每次入栈的符号的优先级都比当前的栈顶元素要高,若此时栈顶的优先级比入栈元素低或者等于的话,则需要出栈
//知道遇到比当前需要入栈元素优先级高的为止
void midtopost(string in,vector<string>& vec)
{
     stack<char> s;
     string rst="";
     int i=0;
     while(true)
     {
         if(i>=in.length()) break;
         if(isdig(in[i]))
         {
             string num="";
             while(isdig(in[i])) num+=in[i++];
             vec.push_back(num);
         }
         else
         {
             if(s.empty()) s.push(in[i++]);
             else
             {
                 if(in[i]==‘(‘) {s.push(in[i]);}
                 else if(in[i]==‘)‘)
                 {
                     while(s.top()!=‘(‘)
                     {
                         string temp="";
                         temp+=s.top();
                         vec.push_back(temp);
                         s.pop();
                     }
                     s.pop();
                 }
                 else
                 {
                     if(priority(in[i])>priority(s.top())||s.top()==‘(‘) s.push(in[i]);
                     else
                     {
                         //判断是否为空必须写在前面,符合短路原则
                         while(!s.empty()&&(priority(in[i])<=priority(s.top())))
                         {
                             string temp="";
                             temp+=s.top();
                             vec.push_back(temp);
                             s.pop();
                         }
                         s.push(in[i]);
                     }
                 }
                 ++i;
             }

         }
     }
     //清空栈
     while(!s.empty())
     {
         string temp="";
         temp+=s.top();
         vec.push_back(temp);
         s.pop();
     }
}

//后缀表达式的计算,数字进栈,符号将栈顶两个元素出栈,运算后进栈
int calc(vector<string>& vec)
{
    stack<int> s;
    for(int i=0;i<vec.size();++i)
    {
        if(!vec[i].compare("*"))
        {
            int x=s.top();
            s.pop();
            int y=s.top();
            s.pop();
            s.push(x*y);
        }
        else if(!vec[i].compare("-"))
        {
            int x=s.top();
            s.pop();
            int y=s.top();
            s.pop();
            s.push(y-x);
        }
        else if(!vec[i].compare("+"))
        {
            int x=s.top();
            s.pop();
            int y=s.top();
            s.pop();
            s.push(x+y);
        }
        else if(!vec[i].compare("/"))
        {
            int x=s.top();
            s.pop();
            int y=s.top();
            s.pop();
            s.push(y/x);
        }
        else
        {
            s.push(toint(vec[i]));
        }
    }
    return s.top();
}

int main()
{
    string in="9+(3-1)*3+10/2";
    //string s="9 3 1 - 3 * + 10 2 / +";
    vector<string> vec;
    midtopost(in,vec);
    cout<<calc(vec)<<endl;
    return 0;
}
时间: 2024-08-26 03:13:24

C++ 利用栈解决运算问题的相关文章

利用栈解决一些基本问题

1.括号匹配问题 #include "stdafx.h" #include "stdio.h" #include "string.h" #define maxSize 100 int main(int argc, char* argv[]) { char exp[maxSize]; char stack[maxSize]; int top=-1; int i,len; scanf("%s",exp); len=strlen(e

将中缀表达式转换为后缀表达式,然后利用栈对表达式求值。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js.js"></script> </head> <body> 输入中缀表达式空格分隔 例如 2 + 3 <input type=

【Java EE 学习第69天】【struts2】【paramsPrepareParamsStack拦截器栈解决model对象和属性赋值冲突问题】

昨天有同学问我问题,他告诉我他的Action中的一个属性明明提供了get/set方法,但是在方法中却获取不到表单中传递过来的值.代码如下(简化后的代码) 1 public class UserAction implements modelDriven<User>(){ 2 private String name; 3 private User model; 4 public void setName(String name){ 5 this.name=name; 6 } 7 public St

数据结构应用:利用栈破解迷宫游戏

最近刚开始学数据结构,发现数据结构真是个神奇的东西哈,很多现实中的问题都可以用不同的数据结 构来解决,比如利用和栈中缀表达式编写一个计算机程序,利用栈破解迷宫游戏,今天我就来跟大家分 享一下如何利用栈来破解迷宫游戏. 学过数据结构的人都知道,栈的特点是:后进先出(First In Last Out);也就是说只能在栈的尾部进 行压栈和出栈,而且出栈的时候只能从最后一个数据开始.如下图: 而我们在破解迷宫游戏的时候采用的方法是"回溯",也就是在寻找通路的时候,每找到一个通路,就将这个数据

栈解决汉诺塔问题

汉诺塔问题比较经典,这里修改--下游戏规则: 现在限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间. 求当塔有N层的时候,打印最优移动过程和最优移动总步数. 在走出最少步数过程中的任何时刻,四个动作中只有一个动作不违反小压大和相邻不可逆原则(相邻的两次操作不互为逆操作如:MtoR和RtoM),另外三个动作一定都会违反. #include <iostream> #include <stack> using namespace std; enum

利用gulp解决微信浏览器缓存问题

做了好多项目,这次终于要解决微信浏览器缓存这个令人头疼的问题了.每次上传新的文件,在微信浏览器中访问时,总要先清除微信的缓存,实在麻烦,在网上搜罗了很多解决办法,终于找到了方法:利用gulp解决缓存问题.关于gulp大家可以去gulp官网去详细了解. 这篇文章主要参考于Gulp解决发布线上文件(CSS和JS)缓存问题和Gulp.js----比Grunt更易用的前端构建工具两篇文章,在这里先谢过原作者. 本文主要记录安装gulp以及使用.解决缓存问题的过程,以便日后方便查阅. 1.安装NodeJS

用栈解决Largest Rectangle问题

一问题描述 Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram. Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]. The la

利用栈计算算数表达式的值

先将中缀表达式利用栈转换为后缀表达式,然后再利用栈由后缀表达式计算算数表达式的值,具体代码如下: #include <iostream> using namespace std; #include <string> #include <vector> #include <stack> enum Type { OP_NUM, OP_SYMBOL, }; enum Operat { ADD, SUB, MUL, DIV, }; struct Cell { Typ

利用IIS7 解决URL访问限制问题

网站可以通过URl直接访问一些不希望被访问的东西, 比如一些图片,js,css等等. 为了解决这个问题看了好多文章,不过毕竟我是新手菜鸟级别的,没有具体的解决方法,真心不知道怎么弄. 今天在看IIS的时候突然发现有一个叫"请求筛选"的东东,点击进入,发现里面可以配置筛选规则, 比如你可以自己添加 "拒绝文件扩展名",那么所有的符合你添加的那个文件扩展名的文件,都不能访问了. 具体: 打开IIS管理器--->点击你想要配置的网站,打开主页---->点击请求