利用栈实现的后缀形式的算术表达式的求值的c++程序

/*
 * stack demo, evaluation for arithmetic expression
 * Time-stamp: <2011-08-24 15:17:31 root>
 *
 * snallie@tom.com
 */
#include <iostream>
using namespace std;

template < class T > class stk {
#define SIZE 100
  public:
  stk():sp(0) {
    stk_base = new T[SIZE];
    stk_bottom = stk_base + SIZE - 1;
    sp = SIZE;
    }

    ~stk() {
    delete stk_base;
    }

    void push(T a) {
    if (!stk_full())
        stk_base[--sp] = a;
    }

    T pop() {
    if (!stk_empty())
        return stk_base[sp++];
    }

    bool stk_empty() {
    return (sp == SIZE);
    }

    bool stk_full() {
    return (sp == 0);
    }

    T get_top() {
    return stk_base[sp];
    }

    void stk_dump() {
    int i;
    for (i = SIZE - 1; i >= sp; i--) {
        cout << stk_base[i] << " ";
    }
    cout << endl;
    }

  private:
    int sp;
    T *stk_base;
    T *stk_bottom;
};

int main()
{
    int i, j;
    char a[] = "(5*(((9+8)*(4/6))-7))";
    char c[40];
    stk < char >b;
    int N = strlen(a);
    printf("%s\n", a);
    for (i = 0, j = 0; i < N; i++)    // convert a[] to postsuffix
    {
    if (a[i] == ')')
        printf("%c ", (c[j++] = b.pop()));
    if ((a[i] == '+') || (a[i] == '*') || (a[i] == '-')
        || (a[i] == '/'))
        b.push(a[i]);
    if ((a[i] >= '0') && (a[i] <= '9'))
        printf("%c ", (c[j++] = a[i]));
    }
    printf("\n");
    c[j] = 0;
    printf("%s\n", c);

    stk < float >d;
    int k = 0;

    while (c[k] != 0) {
    printf("%c# ", c[k]);
    switch (c[k]) {
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
        d.push(c[k] - 0x30);
        d.stk_dump();
        break;

    case '+':
        d.push(d.pop() + d.pop());
        d.stk_dump();
        break;

    case '-':
        d.push(-(d.pop() - d.pop()));
        d.stk_dump();
        break;

    case '/':
        {
        float oprnd1 = d.pop();
        float oprnd2 = d.pop();
        d.push(oprnd2 / oprnd1);
        d.stk_dump();
        break;
        }

    case '*':
        d.push(d.pop() * d.pop());
        d.stk_dump();
        break;

    default:
        break;

    }
    k++;
    }

    cout << a << "=" << d.pop() << endl;
    return 0;

}


上一篇: ARMBoot-1.1.0 在 mini2440 开发板上的移植 之稻草人手记
下一篇: 输出gcc的编译器内部预设全部常量宏定义
jocks
博客等级 码龄18年 15粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值