鱼C论坛

 找回密码
 立即注册
查看: 3123|回复: 0

[学习笔记] 《数据结构和算法》——逆波兰表达式

[复制链接]
发表于 2017-7-31 13:57:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
对于所求的中缀表达式,我们首先需要将其转换为后缀表达式,即将运算符写在作用的两个数的后面,然后将中缀表达式的输出作为后缀表达式计算程序的输入。
在一个中缀表达式,我们首先需要用栈来储存级别较高的运算符,如*,(等。在栈中只允许级别较高的运算符在级别较低的运算符上面,所以当读取到级别最低级别最低的“+”和“-”时就将栈中的运算符弹出至“(”或栈为空,“(”可以在任何运算符下面,一旦检测到“)”立刻将栈中的运算符弹出,至“(”的位置。当检测到“*”和“/”时则压入栈中。当输入完毕后将栈中所有符号弹出。


附上计算中缀表达式的算法:
#include<cstdio>
#include<cstdlib>
#include<math.h>
#include<iostream>
using namespace std;

typedef double elem;

class stack1
{
public:
        elem *top, *base;
        int stack_size;
};

class stack2
{
public:
        char *top, *base;
        int stack_size;
};

void Initial(stack1 *s)
{
        s->base = new elem[1000];
        s->top = s->base;
        s->stack_size = 0;
}
void Initial(stack2 *s)
{
        s->base = new char[1000];
        s->top = s->base;
        s->stack_size = 0;
}


void Push(stack1 *s,elem e)
{
        *(s->base) = e;
        s->base++;
        s->stack_size++;
}
void Push(stack2 *s, char e)
{
        *(s->base) = e;
        s->base++;
        s->stack_size++;
}

void Pop(stack1 *s,double *e)
{
        s->stack_size--;
        s->base--;
        *e = *(s->base);
}
void Pop(stack2 *s,char *e)
{
        s->base--;
        s->stack_size--;
        *e = *(s->base);
}


int main()
{
        stack1 s;
        stack2 r;
        char c;
        char str[20];
        elem d;
        Initial(&s);
        Initial(&r);

        printf("输入要计算的中缀表达式(以#结束,数字与符号之间用空格隔开):");
        scanf_s("%c", &c);

        while (c!= '#')
        {
                int i = 0;
                while (isdigit(c) || c == '.')
                {
                        str[i++] = c;
                        str[i] = 0;
                        scanf_s("%c", &c);
                        if (i >= 20)printf("wrong,out of the limit!");
                        if (c == ' ')
                        {
                                d = atof(str);
                                Push(&s, d);
                        }
                }
                if (')' == c)
                {
                        char e;
                        do
                        {
                                Pop(&r, &e);
                                double a, b;
                                switch (e)
                                {
                                case '+':
                                        Pop(&s,&b);
                                        Pop(&s,&a);
                                        Push(&s, a + b);
                                        break;
                                case '-':
                                        Pop(&s, &b);
                                        Pop(&s, &a);
                                        Push(&s, a - b);
                                        break;
                                case '*':
                                        Pop(&s, &b);
                                        Pop(&s, &a);
                                        Push(&s, a * b);
                                        break;
                                case '/':
                                        Pop(&s, &b);
                                        Pop(&s, &a);
                                        Push(&s, a / b);
                                        break;
                                }
                        } while (r.stack_size&&'(' != e);
                }
                else if (c == '+' || c == '-')
                {
                        if (r.stack_size != 0)
                        {
                                char e;
                                do
                                {
                                        Pop(&r, &e);
                                        if ('(' == e)
                                        {
                                                Push(&r, e);
                                                break;
                                        }
                                        double a, b;
                                        switch (e)
                                        {
                                        case '+':
                                                Pop(&s, &b);
                                                Pop(&s, &a);
                                                Push(&s, a + b);
                                                break;
                                        case '-':
                                                Pop(&s, &b);
                                                Pop(&s, &a);
                                                Push(&s, a - b);
                                                break;
                                        case '*':
                                                Pop(&s, &b);
                                                Pop(&s, &a);
                                                Push(&s, a * b);
                                                break;
                                        case '/':
                                                Pop(&s, &b);
                                                Pop(&s, &a);
                                                Push(&s, a / b);
                                                break;
                                        }
                                } while (r.stack_size != 0 && e != '(');
                                Push(&r, c);
                        }
                        else if (r.stack_size == 0)
                        {
                                Push(&r, c);
                        }
                }
                else if ('*' == c || '/' == c||'('==c)
                {
                        Push(&r, c);
                }
                scanf_s("%c", &c);
        }
        while (r.stack_size != 0)
        {
                char e;
                double a, b;
                Pop(&r, &e);
                switch (e)
                {
                case '+':
                        Pop(&s, &b);
                        Pop(&s, &a);
                        Push(&s, a + b);
                        break;
                case '-':
                        Pop(&s, &b);
                        Pop(&s, &a);
                        Push(&s, a - b);
                        break;
                case '*':
                        Pop(&s, &b);
                        Pop(&s, &a);
                        Push(&s, a * b);
                        break;
                case '/':
                        Pop(&s, &b);
                        Pop(&s, &a);
                        Push(&s, a / b);
                        break;
                }
        }
        Pop(&s,&d);
        printf("answer is %.2f\n", d);
        system("PAUSE");
}

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 21:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表