【算法4】迪杰斯特拉双栈算法

算法4的语言载体是Java,所以书上算法的实现是以Java语言形式来的。一个非常经典的算法,在这里把他以C++重写一遍,加深印象的同时给广大网友一个参考。

问题描述:
求形如 (1*((2+3)*(4*5)))的算术表达式。

这里运算的优先级都用挎号提现出来了,所以也降低了算法的实现难度。

算法思想:

这里定义两个栈,一个栈用来存操作数(aux),另一个栈用来存运算符(ope)

具体步骤:

1.将操作数压入操作数栈;

2.将运算符压入运算符栈;

3.忽略左括号;

4.在遇到右括号得时候弹出一个运算符,弹出所需数量得操作数,并将运算符和操作数的运算结果压入操作数栈。

在处理完最后一个右括号之后,操作数栈上只会有一个值,就是计算结果。

下面给出栈的设计以及测试用例:

栈的设计

#include<iostream>
using namespace std;
template <class Type> //栈的模板类定义
class MyStack {
private:
    vector<Type> data;
    int ret;
    int size;
public:
    MyStack();       //构造函数
    void push(Type x);//压栈操作
    bool isEmpty();   //判断栈是否为空
    Type pop();       //出栈操作
    int FetchSize() { return data.size }; //获取栈的大小
};
template <class Type>
MyStack<Type>::MyStack()
{
    ret = 0;
    size = 0;
}
template <class Type>
void MyStack<Type>::push(Type x) {
    data.push_back(x);
}

template <class Type>
bool MyStack<Type>::isEmpty() {
    return data.empty();
}
template <class Type>
Type MyStack<Type>::pop() {
    if (isEmpty()) {
        return false;
    }
    ret = data.back();
    data.pop_back();
    return ret;
}

算法实现

#include<iostream>
#include<vector> 
#include<string>
#include "Stack.h"
#include<math.h>
using namespace std;
int main()
{
    MyStack<char> ops = MyStack<char>();     //定义运算符栈
    MyStack<double> vals = MyStack<double>();//定义操作数栈
    string operation;
    cin >> operation;
    for (char s:operation) {
        if (s == '(');
        else if (s == '+'|| s == '-'|| s == '*'|| s == '/'|| s == 'sqrt') ops.push(s);
        else if (s == ')')
        {
            char op = ops.pop();
            double v = vals.pop();
            if (op == '+') v = vals.pop() + v;
            else if (op == '-') v = vals.pop() - v;
            else if (op == '*') v = vals.pop() * v;
            else if (op == '/') v = vals.pop() / v;
            else if (op == 'sqrt') v = sqrt(v);
            vals.push(v);
        }
        else { double d = (int)(s-48); vals.push(d); }
    }
    int  result = vals.pop();
    cout << result << endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/hu-19941213/p/11130508.html