1. 程式人生 > >Dijkstra‘s Two-Stack Algorithm for Expression Evalution

Dijkstra‘s Two-Stack Algorithm for Expression Evalution

splay ctr lse reads out ise name algo cout

//用兩個stack來計算表達式的值

java版本:

技術分享圖片
import edu.princeton.cs.algs4.*;

public class Evaluate
{
    public static void main(String[] args)
    {
        Stack<String> ops = new Stack<String>();
        Stack<Double> vals = new Stack<Double>();
        while(!StdIn.isEmpty())// linux下終止輸入(CTRL + d)
{ String s = StdIn.readString(); if(s.equals("(")); else if(s.equals("+")) ops.push(s); else if(s.equals("-")) ops.push(s); else if(s.equals("*")) ops.push(s); else if(s.equals("/")) ops.push(s); else if(s.equals("sqrt")) ops.push(s);
else if(s.equals(")")) { String op = ops.pop(); double v = vals.pop(); if(op.equals("+")) v = vals.pop() + v; else if(op.equals("-")) v = vals.pop() - v; else if(op.equals("*")) v = vals.pop() * v;
else if(op.equals("/")) v = vals.pop() / v; else if(op.equals("sqrt")) v = Math.sqrt(v); vals.push(v); } else vals.push(Double.parseDouble(s)); } StdOut.println(vals.pop()); } }
java版

c++版本:

技術分享圖片
#include <iostream>
#include <stack>
#include <string>

int main()
{
    using namespace std;
    stack<double> s1;
    stack<char> s2;
    string str;
    cout << "input a expression: " << endl;
    getline(cin,str);
    char ch;
    char ch2;
    int i = 0;    
    while(i < str.length())
    {
        ch = str[i];
        if(ch == ();
        else if(ch == +) s2.push(ch);
        else if(ch == -) s2.push(ch);
        else if(ch == *) s2.push(ch);
        else if(ch == /) s2.push(ch);
        else if(ch == ))
        {
            ch2 = s2.top();
            s2.pop();
            double v = s1.top();
            s1.pop();
            if(ch2 == +) 
            {
                v = s1.top() + v;
                s1.pop();
            }
            else if(ch2 == -)
            {
                v = s1.top() - v;
                s1.pop();
            }
            else if(ch2 == *)
            {
                v = s1.top() * v;
                s1.pop();
            }
            else if(ch2 == /)
            {
                v = s1.top() / v;
                s1.pop();
            }
            s1.push(v);           
        }
        else if(ch ==  );
        else s1.push(ch - 0);
        i++;
    }
    cout << " the answer is " << s1.top() << endl;
    return 0;
}
c++版

Dijkstra‘s Two-Stack Algorithm for Expression Evalution