堆疊問題

Home Home
引用 | 編輯 醉飲寒霜
2007-12-04 20:54
樓主
推文 x0
請問板上的高手大大~~~
怎麼使用C++來寫出兩個堆疊計算中序式的程式
一 ..

訪客只能看到部份內容,免費 加入會員



獻花 x0
引用 | 編輯 daviddr
2008-05-26 02:37
1樓
  
用一個堆疊寫出後序式!? 可否看看程式?
難道.. 中序式裡已經用括弧括出各 operator 優先權了嗎?

獻花 x0
引用 | 編輯 daviddr
2008-05-28 18:11
2樓
  
複製程式
template <class T, int N=512> struct Stack
{
    T   d[N];      //資料項
    int n;         //元素個數  
    Stack()        { n = 0; }
    void push (T x){ d[n++] = x; }
    T pop()        { return d[--n]; } 
    T& operator*() { return d[n-1]; }
    T& operator[] (int i) { return d[i]; }
};

double calculate (Stack<char>& s)
{
    Stack<double> v;
    char c; double d;

    for (int i=0; i<s.n; i++) 
    {
        c = s[i];
        if (Ɔ'<=c && c<=Ə') { 
            v.push (c-Ɔ'); 
            continue; 
        }
        d = v.pop();
        switch (c) {
           case'+': *v += d; break;
           case'-': *v -= d; break;
           case'*': *v *= d; break;
           case'/': *v /= d; break;
        }        
    }
    return *v;
}

void main()
{
    Stack<char> num, op;                   //num 放後序式, op 放運算符
    char c, pri[128], *p = "8*(1+9)-8/2";  //pri=運算元優先權
    int i=128;

    while (i--) pri[i] = 3;
    pri['*']= pri['/'] = 2; 
    pri['+']= pri['-'] = 1; 
    pri[')']= 0; 
    pri['(']= 5;
   
    for (;c=*p; c^')'? op.push(c): op.pop(), p++)     
        while (pri[c] <= pri[*op] && '('!=*op) 
            num.push (op.pop());        
    while (op.n > 0) num.push (op.pop());
    
    for (i=0; i<num.n; i++) cout<<num[i];   //印出 postfix
    cout <<endl <<calculate (num);          //印出運算結果
}


獻花 x0