(算法)求表达式(含括号)的值

题目:

求字符串表达式的值,如"-2+(3+4)-5*6",返回-25.

思路:

分离数字和运算符并考虑运算符的优先级,如(),*,/,+,-等。

两个栈:一个存数字,一个存运算符

代码:

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

double calc(double a,char op,double b){
    if(op==‘+‘)
        return a+b;
    if(op==‘-‘)
        return a-b;
    if(op==‘*‘)
        return a*b;
    if(op==‘/‘)
        return a/b;
}

bool isdigit(char s){
    int a=s-‘0‘;
    if(a>=0 && a<=9)
        return true;
    return false;
}

template<class out_T,class in_T>
out_T convert(const in_T &t){
    stringstream ss;
    out_T result;
    ss<<t;
    ss>>result;
    return result;
}

int main(){
    string s;
    double x,y;
    char op;
    int priv[300];
    priv[‘+‘]=priv[‘-‘]=2;
    priv[‘*‘]=priv[‘/‘]=1;
    priv[‘(‘]=10;

    while(cin>>s){
        stack<double> num;
        stack<char> oper;
        int len=s.size();
        int start=0;
        string str;
        char last=0;

        for(int i=0;i<len;i++){
            if(isdigit(s[i])){
            //    num.push(s[i]-‘0‘);
                start=i;
                for(;i+1<len && (isdigit(s[i+1]) || s[i+1]==‘.‘);i++);
                str=s.substr(start,i-start+1);
                num.push(convert<double>(str));
            }
            else if(s[i]==‘(‘){
                oper.push(s[i]);
            }
            else if(s[i]==‘)‘){
                while(!oper.empty() && oper.top()!=‘(‘){
                    x=num.top();
                    num.pop();
                    y=num.top();
                    num.pop();
                    op=oper.top();
                    oper.pop();
                    num.push(calc(x,op,y));
                }
                oper.pop();
            }
            else if(s[i]==‘-‘ && (last==0 || last==‘(‘)){
                num.push(0.0);
                oper.push(‘-‘);
            }
            else if(priv[s[i]]>0){
                while(oper.size()>0 && priv[s[i]]>=priv[oper.top()]){
                    y=num.top();
                    num.pop();
                    x=num.top();
                    num.pop();
                    op=oper.top();
                    oper.pop();
                    num.push(calc(x,op,y));
                }
                oper.push(s[i]);
            }
            else
                continue;
            last=s[i];
        }
        while(oper.size()>0){
            y=num.top();
            num.pop();
            x=num.top();
            num.pop();
            op=oper.top();
            oper.pop();
            num.push(calc(x,op,y));
        }
        cout<<num.top()<<endl;
    }
    return 0;
}
时间: 2024-08-13 07:52:01

(算法)求表达式(含括号)的值的相关文章

(算法)求表达式(不含括号)的值

题目: 求字符串表达式(不含括号)的值 思路: 数字分离 运算符优先级+-*/ 只需一个字符串栈,保存数字和运算符 代码: #include<iostream> #include<stack> #include<sstream> #include<string> using namespace std; template<class out_T,class in_T> out_T convert(const in_T &t){ strin

用递归下降分析求表达式的值

<数据结构>中表达式求值的经典算法是用两个栈,一个存数字,一个存运算符.依次读入表达式中的每个字符,若是数字则进数字栈,若是运算符则和运算符栈的栈顶运算符比较优先权作相应操作,直至整个表达式求值完毕.运算符的优先级表如下   + - * / ( ) # + > > < < < > > - > > < < < > > * > > > > < > > / > >

谁能帮帮我-栈求表达式的值

求表达式的值 下面的代码有问题,带括号的算不了,哪位大佬能帮我修复一下:我崩溃了.... #include<stdio.h> #include<stdio.h> #include <stdlib.h> typedef struct { int num[100]; int top; }Stack1; typedef struct { char num[100]; int top; }Stack2; void Init_stack1(Stack1 *s) { s->t

求表达式的值--栈和队列的应用

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define OK 1 5 #define ERROR 0 6 #define STACK_SIZE 20 7 #define STACK_INCREMENT 10 8 #define QUEUE_SIZE 20 9 10 typedef int Status; 11 12 typedef char StackElemtype; 13 typedef struct Stack{ 14 Sta

矩阵连乘 和表达式加括号求最大值

矩阵连乘核心代码1 for(int i=0;i<=n;i++) 2 m[i][j]=0; 3 for(r=1;r<n;r++) 4 for(i=1;i<=n-r;i++) 5 { 6 j=i+r; 7 m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j]; 8 s[i][j]=i; 9 for(k=i+1;k<j;k++) 10 { 11 int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]; 12 if(t<m[i][j]) 13

笔试算法题(22):二分法求旋转数组最小值 &amp; 骰子值概率

出题:将一个数组最开始的k个(K小于数组大小N)元素照搬到数组末尾,我们称之为数组的旋转:现在有一个已经排序的数组的一个旋转,要求输出旋转数组中的最小元素,且时间复杂度小于O(N): 分析: 时间复杂度小于O(N)也就是不能用常规的遍历思路:可以将数组看成两个都是递增序列(假设为升序)的子数组,并且前半段的元素均大于等于后半段的元素,分界点的位于后半段数组的第一个元素就是最小元素: 具体算法:两个指针left和right指向数组第一个和最后一个元素,使用Binary Search确定中间元素mi

poj3565 Ants km算法求最小权完美匹配,浮点权值

/** 题目:poj3565 Ants km算法求最小权完美匹配,浮点权值. 链接:http://poj.org/problem?id=3565 题意:给定n个白点的二维坐标,n个黑点的二维坐标. 求是否存在n条边,每条边恰好连一个白点,一个黑点,且所有的边不相交. 输出所有黑点连接的白点编号. 思路:最小权完美匹配. 假定有白点1(a1,b1), 2(a2,b2), 黑点3(a3,b3),4(a4,b4); 如果1(a1,b1)与3(a3,b3)相连,2(a2,b2)与4(a4,b4)相连,如

POJ-2195 Going Home---KM算法求最小权值匹配(存负边)

题目链接: https://vjudge.net/problem/POJ-2195 题目大意: 给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致.man每移动一格需花费$1(即单位费用=单位距离),一间house只能入住一个man.现在要求所有的man都入住house,求最小费用. 思路: KM算法传送门: 理解篇    运用篇 每个man和house建立带权二分图,曼哈顿距离就是边的值,这里要求最小费用,也就是二分图最小权值匹配,但是KM算法求的是二分图最

算法训练 表达式计算

问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 -4 数据规模和约定 表达式长度不超过100,表达式运算合法且运算过程都在int内进行. import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.ArrayList; import java.uti

如何防范算法求逆

假如您不幸遇到对Win32应用环境有足够了解的对手,以至于您的软件最终还是被凶悍的调试器任意蹂躏.但是您还远没有被打败,如果反调试技术(Anti-Debug)作为软件保护的第一道防线已经失守,您的对手只不过是掌握了一大堆汇编代码而已,毕竟代码和算法之间还是有相当距离的,所以您还有第二道防线可守--抗分析.在这道防线里,您有很多办法可以限制破解者掌握您的加密算法,从而阻止注册机或者破解补丁的出现. 一.前言 软件保护的目的是只向合法用户提供完整的功能,所以软件保护必然要包括验证用户合法性的环节,而