后缀表达式求值

来源:互联网 发布:wap彩票网站源码 编辑:程序博客网 时间:2024/05/16 16:54

  后缀表达式求值过程中不需要考虑运算符的优先级,只需要对该表达式中的每一个元素进行判断,若为操作数则将其存储在一个数组里(入栈),若为运算符则取出前面的两个操作数(弹栈)并运算,并将运算结果放回该数组(入栈),最终数组的最后一个元素(栈顶元素)即为该表达式的运算结果.

  如: 后缀表达式 "23+=" 等价于中缀表达式: "2+3="  运算结果为: 5

    后缀表达式 "56*=" 等价于中缀表达式: "5*6="  运算结果为: 30

    后缀表达式 "12+82-74-/*=" 等价于中缀表达式: "(1+2)*(8-2)/(7-4)"  运算结果为: 6


emmmm.... 别的不说,先上代码吧.

  

#include <stdio.h>
#include <malloc.h>
#include <string.h>

#define MAX 100

int main(void)      //后缀表达式求值
{
    int i, j = 0, temp;
    char arr[MAX];    //arr[]用来存储后缀表达式
    int stack[MAX];    //栈

    /*输入一个后缀表达式*/
    printf("请输入一个后缀表达式:\n");
    scanf("%s", arr);
    /*for (i = 0; i < MAX; i++)
    {
        scanf("%c", &arr[i]);
    }*/

    /*后缀表达式求值*/
    for (i = 0; arr[i] != '='; i++)
    {
        if ((arr[i] >= '0') && (arr[i] <= '9'))
        {
            stack[j++] = arr[i] - '0';  //arr[i]为数字则将其存储在stack[]数组中
        }
        else     //arr[i]若为运算符则同前两个数字一起运算
        {
            switch (arr[i])
            {
            case '+':
                temp =stack[j - 2] +stack[j - 1];
                j = j - 2;
                stack[j++] = temp;
                break;
            case '-':
                temp =stack[j - 2] -stack[j - 1];
                j = j - 2;
                stack[j++] = temp;
                break;
            case '*':
                temp =stack[j - 2] *stack[j - 1];
                j = j - 2;
                stack[j++] = temp;
                break;
            case '/':
                temp =stack[j - 2] /stack[j - 1];
                j = j - 2;
                stack[j++] = temp;
                break;
            }
        }
    }

    printf("该表达式的值为: %d\n",stack[j - 1]);    

    return 0;
}

后缀表达式求值有一个很大的弊端,那就是只能对个位数进行运算,要想摒除这个弊端很简单,单单用结构体指针就可以解决问题.这里我抛砖引玉就不再对其链表实现方式进行描述.


另外,再放上我的运行结果.








原创粉丝点击