栈在表达式求值中的应用

将中缀表达式转成后缀表达式。

#include<iostream>
#include <stack>
#include<map>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

using namespace std;
//把中缀表达式转化为后缀表达式  a+b-a*((c+d)/e-f)+g#    1+2-3*((4+5)/3-6)+7#e
int Complete(int a,int b,char c){
    if(c==‘+‘){
        return a+b;
    }else if(c==‘-‘){
        return a-b;
    }else if(c==‘*‘){
        return a*b;
    }else
       return a/b;
}
//void InitS()
int main(){
    map<char,int> ispM;
    map<char,int> icpM;
    stack<int> s1;
    stack<char> s2;
    char res[20];
    ispM[‘#‘]=0;ispM[‘(‘]=1;ispM[‘*‘]=ispM[‘/‘]=5;ispM[‘+‘]=ispM[‘-‘]=3;ispM[‘)‘]=6;
    icpM[‘#‘]=0;icpM[‘(‘]=6;icpM[‘*‘]=icpM[‘/‘]=4;icpM[‘+‘]=icpM[‘-‘]=2;icpM[‘)‘]=1;

    s2.push(‘#‘);
    char c;
     //InitS();
     int coun=0;
    memset(res,0,sizeof(res));
    while(scanf("%c",&c)!=EOF){
            if(c==‘e‘) {
                break;
            }
        if(c>=‘0‘&&c<=‘9‘){
            res[coun++]=c;
          //  cout<<c;
        }else{
            if(ispM[s2.top()]>icpM[c]){
            while(ispM[s2.top()]>icpM[c]){
                res[coun++]=s2.top();
                s2.pop();
            }
            }
            if(ispM[s2.top()]<icpM[c]){
                s2.push(c);
            }

            if(ispM[s2.top()]==icpM[c]){
                s2.pop();
            }
        }
    }
    for(int i=0;i<coun;i++){
        if(res[i]>=‘0‘&&res[i]<=‘9‘){
            s1.push(res[i]-‘0‘);
        }else  {
            int t1=s1.top();
            s1.pop();
            int t2=s1.top();
            s1.pop();
            int newdata=Complete(t2,t1,res[i]);
            s1.push(newdata);
        }
    }
    cout<<s1.top()<<endl;
    s1.pop();

    return 0;
}
时间: 2024-10-03 12:40:36

栈在表达式求值中的应用的相关文章

栈实现表达式求值

本文简单的设计了一个针对一位整数的四则运算进行求值的算法,对于处理多位整数的四则运算,需要对本文接受输入的数据类型进行升级,把字符数组换成字符串数组,将一个整数的多位数字存入一个字符串进行处理. 代码如下: 1 //用栈实现表达式求值(简化版) 2 #include<iostream> 3 #include<string> 4 #include<cassert> 5 using namespace std; 6 //栈的基本操作的实现 7 template<typ

算法手记(2)Dijkstra双栈算术表达式求值算法

这两天看到的内容是关于栈和队列,在栈的模块发现了Dijkstra双栈算术表达式求值算法,可以用来实现计算器类型的app. 编程语言系统一般都内置了对算术表达式的处理,但是他们是如何在内部实现的呢?为了了解这个过程,我们可以自行搭建一套简易的算术表达式处理机制,这里就用到栈特性和本篇提到的Dijkstra算法. 概述:     算术表达式可能是一个数.或者是由一个左括号.一个算术表达式.一个运算符.另一个算术表达式和一个右括号组成的表达式.为了简化问题,这里定义的是未省略括号的算术表达式,它明确地

栈应用—表达式求值

#include<stdio.h> #include<stdlib.h> #define LENGTH 100 //初始分配栈的长度 #define ADD_LEN 10 //栈长增量 typedef struct //定义字符栈 { int *base; int *top; int stacksize; }SqStack; void InitStack(SqStack &S); //初始化一个栈 void Push(SqStack &S,int e); //e进入

序列点在C语言表达式求值中的作用

摘要: 本文开创性地分析了序列点在C语言表达式求值中的作用:序列点左边的操作数要先于其右边的操作数求值.讨论了逗号操作符,.逻辑与操作符&&.逻辑或操作符||和条件操作符?:的问号处需要序列点的原因.举例分析了序列点在表达式求值中的作用. 关键字:序列点 表达式求值 C语言 C语言作为一种主流程序设计语言,许多编程语言如Java.C++.C#都借鉴了它的语法.C语言也是一种很适当的程序设计入门的教学语言,国内大专院校的许多专业都开设了这门课程并且大多将其作为第一门程序设计语言课程,同时C语

Dijkstra的双栈算术表达式求值

import java.util.Stack; import java.util.Scanner; public class Evaluate { public static void main(String[] args) { Stack<String> ops=new Stack<String>(); Stack<Double> vals=new Stack<Double>(); Scanner cin=new Scanner(System.in); /

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

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

使用栈实现表达式求值

看书学了一晚上这个内容,终于实现了 分为三个步骤: 0. 检查输入是否有误(因为输入其他的非预期字符,程序就会崩溃,我就试着加了一个检查输入的函数) 1. 先将正常的中缀表达式转换为后缀表达式 2. 再进行求值 根据后缀表达式求值比较简单,因为后缀表达式已经有了优先级. 比较难懂的是将中缀表达式转换为后缀表达式,需要考虑很多情况: 1. 如果字符是 '(' ,就直接入操作符栈,因为越内层的括号优先级越高,所以不用考虑什么 2. 如果字符是 ')' ,就要结束一个左括号了,将前面的操作符出栈送入p

Dijkstra的双栈算术表达式求值算法 C++实现

1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 template<typename T> 6 class Stack 7 { 8 private: 9 T stack[100]; 10 int i = 0; 11 public: 12 Stack() = default; 13 14 T pop() 15 { 16 if (i == -1) 17 { 18 cout <<

栈练习--Dijkstra的双栈算术表达式求值算法

此法还有待完善,比如在做除法运算时未判断除数是否为0,而且也可以加以扩展,比如log.sin.操作符优先级.. 1 public class Evaluate { 2 3 public static void main(String[] args) { 4 String steam = "( 1 + ( 2 + 3 ) * ( 4 * 5 ) ) )"; 5 // String steam = "( ( 1 + sqrt ( 5.0 ) ) / 2.0 )"; 6