栈的应用实践之计算机执行后缀表达式

来源:互联网 发布:国家二级c语言成绩 编辑:程序博客网 时间:2024/06/05 10:40

1,算法的思路如下:

                                   

2,算法的框架如下:

                                                                                 

3,这里我们用到了之前写的栈,这里就不再重复写了,它们是:

      LinkList.h

      LinkList.c

      LinkStack.h

      LinkStack.c


4,写一个工程,实现这个算法,main.c 如下:

  #include <stdio.h>
#include "LinkStack.h"

int isNumber(char c)
{
    return ('0' <= c) && (c <= '9');
}

int isOperator(char c)
{
    return (c == '+') || (c == '-') || (c == '*') || (c == '/');
}

int value(char c)
{
    return (c - '0');
}

int express(int left, int right, char op)
{
    int ret = 0;
    
    switch(op)
    {
        case '+':
            ret = left + right;
            break;
        case '-':
            ret = left - right;
            break;
        case '*':
            ret = left * right;
            break;
        case '/':
            ret = left / right;
            break;
        default:
            break;
    }
    
    return ret;
}

int compute(const char* exp)
{
    LinkStack* stack = LinkStack_Create();
    int ret = 0;
    int i = 0;
    
    while( exp[i] != '\0' )
    {
        if( isNumber(exp[i]) )
        {
            LinkStack_Push(stack, (void*)value(exp[i]));
        }
        else if( isOperator(exp[i]) )
        {
            int right = (int)LinkStack_Pop(stack);
            int left = (int)LinkStack_Pop(stack);
            int result = express(left, right, exp[i]);
            
            LinkStack_Push(stack, (void*)result);
        }
        else
        {
            printf("Invalid expression!");
            break;
        }
        
        i++;
    }
    
    if( (LinkStack_Size(stack) == 1) && (exp[i] == '\0') )
    {
        ret = (int)LinkStack_Pop(stack);
    } 
    else 
    {
        printf("Invalid expression!");
    }
    
    LinkStack_Destroy(stack);
    
    return ret;
}

int main()
{
    printf("9 + (3 - 1) * 5 + 8 / 2 = %d\n", compute("931-5*+82/+"));
    
    return 0;
}


小结:

    1,中缀表达式是人习惯的表达方式。

    2,后缀表达式是计算机喜欢的表达方式。

    3,通过栈可以方便的将中缀形式变换为后缀形式。

    4,中缀表达式的计算过程类似于程序编译运行的过程

0 0
原创粉丝点击