堆叠问题

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