栈实现表达式求值

本文简单的设计了一个针对一位整数的四则运算进行求值的算法,对于处理多位整数的四则运算,需要对本文接受输入的数据类型进行升级,把字符数组换成字符串数组,将一个整数的多位数字存入一个字符串进行处理。

代码如下:

  1 //用栈实现表达式求值(简化版)
  2 #include<iostream>
  3 #include<string>
  4 #include<cassert>
  5 using namespace std;
  6 //栈的基本操作的实现
  7 template<typename Type> class Stack {
  8 private:
  9     Type *elements;
 10     int top_index,max_size;
 11 public:
 12     Stack(int length_input) {
 13         elements=new Type[length_input];
 14         max_size=length_input;
 15         top_index=-1;
 16     }
 17     ~Stack() {
 18         delete[] elements;
 19     }
 20     bool push(Type element) {
 21         if(top_index+1>=max_size){
 22             return false;
 23         }
 24         top_index++;
 25         elements[top_index]=element;
 26         return true;
 27     }
 28     bool pop() {
 29         if(top_index<0){
 30             return false;
 31         }
 32         top_index--;
 33         return true;
 34     }
 35     Type top() {
 36         assert(top_index>=0);
 37         return elements[top_index];
 38     }
 39     bool empty() {
 40         return top_index<0;
 41     }
 42 };
 43 //比较运算符的优先级
 44 bool precede(char cur, char top) {
 45     if((cur==‘*‘||cur==‘/‘)&&(top==‘+‘||top==‘-‘)){
 46         return true;
 47     }
 48     return false;
 49 }
 50 //对两个数和一个运算符进行计算
 51 float operate(char opr, float a, float b) {
 52     if(opr==‘+‘){
 53         return a+b;
 54     }
 55     else if(opr==‘-‘){
 56         return b-a;
 57     }
 58     else if(opr==‘*‘){
 59         return a*b;
 60     }
 61     else{
 62         return b/a;
 63     }
 64 }
 65 //取当前栈顶两个数和栈顶运算符进行计算,并将结果压回存数的栈中
 66 //注意这里传入的必须是栈的引用
 67 void calc(Stack<float> &numbers, Stack<char> &operators) {
 68     float a=numbers.top();
 69     numbers.pop();
 70     float b=numbers.top();
 71     numbers.pop();
 72     numbers.push(operate(operators.top(),a,b));
 73     operators.pop();
 74 }
 75 int main() {
 76     int n;
 77     cin>>n;
 78     Stack<float> numbers(n);
 79     Stack<char> operators(n);
 80     string buffer;
 81     cin>>buffer;
 82     int i=0;
 83     while(i<n){
 84         //把数压入相应的栈
 85         if(isdigit(buffer[i])){
 86             numbers.push(buffer[i]-‘0‘);
 87             i++;
 88         }
 89         else{
 90             //如果当前运算符优先级大于栈顶运算符,压入栈顶
 91             if(operators.empty()||precede(buffer[i],operators.top())){
 92                 operators.push(buffer[i]);
 93                 i++;
 94             }
 95             //否则应先对当前栈顶的数进行计算
 96             else{
 97                 calc(numbers,operators);
 98             }
 99         }
100     }
101     while(!operators.empty()){
102         calc(numbers,operators);
103     }
104     //最后存数的栈中存放的就是计算结果
105     cout<<numbers.top()<<endl;
106     return 0;
107 }
时间: 2024-10-13 22:42:28

栈实现表达式求值的相关文章

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算法. 概述:     算术表达式可能是一个数.或者是由一个左括号.一个算术表达式.一个运算符.另一个算术表达式和一个右括号组成的表达式.为了简化问题,这里定义的是未省略括号的算术表达式,它明确地

栈应用—表达式求值

#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进入

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

<!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

栈在表达式求值中的应用

将中缀表达式转成后缀表达式. #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)

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+""