stack计算表达式的值

9.52 使用stack对象处理带圆括号的表达式。遇到左圆括号时,将其标记下来。当你在一个左括号之后遇到右圆括号时,弹出stack对象中这两边括号之间的元素,直到遇到左括号,将左括号也一起弹出栈。 接着在stack对象中压入一个值,用以表明这个用一对圆括号括起来的表达式已经被替换。

程序如下:

#include<iostream>
#include<stack>
#include<string>
using namespace std;

int main()
{
    stack<char> sexp;        //处理表达式的stack对象
    string exp;                //存储表达式的string对象

    //读入表达式
    cout<<"Enter a expression:"<<endl;
    cin>>exp;

    //处理表达式
    string::iterator iter=exp.begin();    //初始迭代器初始位置
    while(iter!=exp.end())
    {
        if(*iter!=')')  //读到的字符不是右圆括号
            sexp.push(*iter);   //标记字符
        else{
            //读到的是右圆括号,弹出元素直到栈顶为左圆括号或栈为空
            while(sexp.top()!='('&&!sexp.empty())
                sexp.pop();
            if(sexp.empty())        //栈为空
            {
                cout<<"parentheses are not matched"<<endl;
                return -1;
            }
            else
            {            //栈顶为左圆括号
                sexp.pop();            //弹出左圆括号
                sexp.push('@');        //表明圆括号的表达式已经被替换
            }
        }
        ++iter;
    }
    if(iter==exp.end())
        cout<<"matched"<<endl;
    return 0;
}

运行结果如下:

时间: 2024-07-31 13:04:03

stack计算表达式的值的相关文章

无法watch-当前方法的代码已经过优化 无法计算表达式的值

问题描述 当前方法的代码已经过优化 无法计算表达式的值 网上找的解决方案是在项目属性里不要勾选 代码优化 可是我的项目一直都没有勾选过 解决方案 你从哪看出来我使用了response.end 和 HttpContext.Current.ApplicationInstance.CompleteRequest 结束 ???? 解决方案二: 这种情况一般是使用了response.end,并将代码放在try catch里,解决办法就是将response.end去掉或正如楼主用HttpContext.Cu

C#动态编译计算表达式的值

C#动态编译计算表达式的值,是通过System.CodeDom.Compiler命名空间下的相关类来实现的.其步骤大致为: 1.将表达式包装成为可编译的C#代码 2.使用反射调用上一步编译的代码. 示例如下:在界面上放一个TextBox,用来输入表达式:放一个按钮,用来相应用户点击,以进行表达式的计算:在另外一个TextBox中显示计算结果.对应的xaml代码如下: <Window x:Class="SampleCodeDemo.MainWindow" xmlns="h

asp.net-Response.End() 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。

问题描述 Response.End() 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值. public void Write(string obj){ Response.Clear(); Response.Write(obj); HttpContext.Current.ApplicationInstance.CompleteRequest(); Response.End();} AJax请求自己的后台页面后台输出参数Write(""1"");报错

c++-C ++ CXX0030: 错误: 无法计算表达式的值

问题描述 C ++ CXX0030: 错误: 无法计算表达式的值 std::vector<VmbUchar_t> * v=NULL; v = new std::vector<VmbUchar_t>; v=( std::vector<VmbUchar_t> *)malloc(100); dateInfo di ; di.frameId=nFrameID;//nFrameID会自动+1 di.v=v; memcpy(di.v,&TransformedData,100

语言决不是语法的不同之.NET 版本计算表达式的值

语法 很多人会说语言只是语法的差异,事实上,大家忽略了一点选择了一种语言,语言的提供者一定会提供很多的系统库给这个语言. 接下来一个简单的例子来结合Jscript.net 和 C# 来实现对一个表达式的计算. 问题要求: 输入一串简单的表达式,输出值.比如2+4*7 返回30 注意我们全部用.net 去实现,呵呵. 1.新建一个jscript文件, CustomEval.js // JScript source codeclass CustomEval{static function eval(

求助 关于 本机框架位于堆栈顶部,因此无法计算表达式的值

问题描述 程序是点击屏幕上的按钮返回数据库中MyClass表中数据的个数代码如下:publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){stringsql="selectcount(*)fromMyStudent";MessageBox.Show(SqlHelper.ExecuteScalar(sql,Comm

vc++2010创建项目失败,无法计算xxx处的属性表达式的值

问题描述 vc++2010创建项目失败,无法计算xxx处的属性表达式的值 vc++2010创建项目失败,报错如下图,求教高手提点. 解决方案 是新建的项目的话,建议重装下vs,再不行重装下系统.

表达式求值、表达式转二叉树

1.后序表达式求值: 后续表达式(逆波兰式)的特点:没有括号. 求值方法: 从前向后扫, 遇到操作数压栈: 遇到操作符,从栈中取出2个操作数运算,结果压栈. 最终栈中所剩的数为结果. 2.中序表达式求值 我们先来定义运算符的优先级: ( +,- *,/,% 从上到下依次升高 准备2个栈,一个专门存放运算符,另一个专门存放操作数. 1.遇到),那么退栈计算到(为止.结果压栈. 2.遇到运算数.那么压栈. 3.如果当前运算符优先级低于栈顶运算符.那么计算栈顶运算符并将结果压栈. 4.否则压栈. 计算

C#算术表达式求值

算术表达式求值是一个经典的问题,很多学习编程的人都对此不陌生.本来我并不想写一个算术表达式求值的算法.在网上我看到了一篇文章,名叫<快速精确的对数学表达式求值>( http://www-128.ibm.com/developerworks/cn/java/j-w3eva/ ).才有兴趣着一个玩玩.写来写去,觉得真得很经典.所以把我写的代码拿出来让大家看看吧.因为时间较紧.所以变量名没有做得很规范. w3eavl是用JAVA写得,我用C#把它重写了一下.基本上能用,只是三角函数/反三角函数/双曲