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 << "栈已空!" << endl;
19             return 0;
20         }
21
22         T top = stack[i - 1];
23         --i;
24         return top;
25     }
26
27     void push(T num)
28     {
29         ++i;
30         stack[i - 1] = num;
31     }
32
33     void clear()
34     {
35         for (int j = 0; j < 100; ++j)
36         {
37             T[j] = 0;
38         }
39     }
40 };
41
42 int main()
43 {
44     Stack<string> ops;
45     Stack<double> num;
46     string str;
47
48     std::cout << "请输入计算式: " << endl;
49     cout << "注: 每个字符间请以空格分开,子表达式请用括号括起注明" << endl;
50     cout << "字符 E 代表结束" << endl;
51     while (true)
52     {
53         cin >> str;
54              if (str == "(")      continue;
55         else if (str == "+") ops.push(str);
56         else if (str == "-") ops.push(str);
57         else if (str == "*") ops.push(str);
58         else if (str == "/") ops.push(str);
59         else if (str == ")")
60         {
61             string op = ops.pop();
62             double val = num.pop();
63             if (op == "+") val = num.pop() + val;
64             if (op == "-") val = num.pop() - val;
65             if (op == "*") val = num.pop() * val;
66             if (op == "/") val = num.pop() / val;
67             num.push(val);
68         }
69
70         else if (str != "E")
71         {
72             double val = stod(str);
73             num.push(val);
74         }
75
76         if (str == "E")
77         {
78             break;
79         }
80     }
81
82     cout << "结果为: ";
83     cout << num.pop() << endl;
84
85     return 0;
86 }

时间: 2024-12-15 06:59:10

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

栈练习--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

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

1 public static double evaluate(String inStr) { 2 Stack<String> ops = new Stack<String>(); //操作符栈 3 Stack<Double> vals = new Stack<Double>(); //操作数栈 4 char[] arr = inStr.toCharArray(); 5 for(char c : arr){ 6 String s =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); /

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

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

Dijkstra双栈算术表达式求值

在看algs4的时候偶然发现了这个算法,又回顾了一遍当时数据结构课程里讲过的知识,当时很不在意.迟早是要还的,哎 用python实现了,比较麻烦的是我现在没有解决bash传参的问题,''(" ")" "*"都需要转义,我直接把"*"改成了"x". 这里又见识到了python的强大之处,list可以当做stack用,贴上官网doc push就用append,pop正好是内置函数,不说了上代码: 1 import sys

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

例如需要计算 ( 1 + (  ( 2 + 3 ) * ( 4 * 5 ) ) ) 我们以字符串的形式输入该表达式,利用两个栈来完成这个操作,其中一个栈保存运算符,一个栈保存操作数,过程是这样的: 表达式由括号,运算符号,操作数(数字)组成,从左到右处理这四种情况. 将操作数压入操作数栈. 将运算符压入运算符栈. 忽略左括号 遇到右括号时,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的结果压入操作数栈中. 在处理完最后一个括号时,操作数栈上只剩下了一个值,它就是表达式的值.每当算法遇

page80-栈用例-算术表达式求值

表达式由括号, 运算符和操作数(数字)组成.我们根据以下4中情况从左到右逐个将这些实体送入栈处理. (1)将操作数压入操作数栈: (2)将运算符压入运算符栈: (3)忽略左括号: (4)在遇到右括号时, 弹出一个运算符,弹出所需数量的操作符,并将运算符和操作符的运算结果压入操作数栈. [地杰斯特拉的双栈算术表达式求值算法] public class Evaluate { public static void main(String[] args) { Stack<String> ops = n

【算法】E.W.Dijkstra算术表达式求值

算术表达式求值 我们要学习的一个栈的用例同时也是展示泛型的应用的一个经典例子,就是用来计算算术表达式的值,例如 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 如果将4乘以5,把3加上2,取它们的积然后加上1,就得到了101.但Java系统是如何完成这些运算的呢?不需要研究Java系统的构造细节,我们也可以编写一个Java程序来解决这个问题.它接受一个输入字符串(表达式)并输出表达式的值.为了简化问题,首先来看一下这份明确的递归定义:算术表达式可能是一个数,或者是由一个左括号

栈的应用—算术表达式求值

例三.算术表达式求值 1.问题描述 当一个算术表达式中含有多个运算符,且运算符的优先级不同的情况下,如何才能处理一个算术表达式????? 2.思路 首先我们要知道表达式分为三类:  ①中缀表达式:a+(b-c/d)*e ②前缀表达式+a*-be ③后缀表达式abcd/-e*+ 由于运算符有优先级,所以在计算机中计算一个中缀的表达式非常困难,特别是带括号的更麻烦,而后缀表达式中既无运算符优先又无括号的约束问题因为在后缀表达式中运算符出现的顺序正是计算的顺序,所以计算一个后缀的表达式更简单.所以,可