zoukankan      html  css  js  c++  java
  • 23、栈的应用-根据后缀表达式求值

    main.c

    #define _CRT_SECURE_NO_WARNING
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include"Stack.h"
    
    //判断是不是数字
    int IsNumber1(char c) {
        return c >= '0' && c <= '9';
    }
    
    typedef struct MYNUM {
        StackNode node;
        int val;
    }MyNum;
    
    
    int Caculate(int left,int right,char c) {
        
        int ret = 0;
        switch (c) {
        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 main()
    {
        char* str = "831-5*+";
        char* p = str;
    
        LinkStack* stack = InitStack();
    
        while (*p!='') {
            if (IsNumber1(*p)) {
                MyNum* num = (MyNum*)malloc(sizeof(MyNum));
                num->val = *p - '0';
    
                Push(stack, num);
    
            }
            else {
    
                //先从栈中弹出右操作数
                MyNum* right = (MyNum*)GetTop(stack);
                int rightNum = right->val;
                Pop(stack);
                free(right);
                //取出左操作数
                MyNum* left = (MyNum*)GetTop(stack);
                int leftNum = left->val;
                Pop(stack);
                free(left);
    
                int ret = Caculate(leftNum, rightNum, *p);
                //结果入栈
                MyNum* num = (MyNum*)malloc(sizeof(MyNum));
                num->val = ret;
                Push(stack,num);
            }
            p++;
        }
    
        if (StackLength(stack) == 1) {
            MyNum* num = (MyNum*)GetTop(stack);
            printf("运算结果是:%d
    ",num->val);
            Pop(stack);
            free(num);
        }
    
        //释放栈
        DestoryStack(stack);
    
        printf("
    ");
        system("pause");
        return 0;
    }
  • 相关阅读:
    第k小元素学习记录
    线段树学习笔记
    数论方面的知识积累
    javascript 例子
    数据绑定以及Container.DataItem的具体分析
    C#委托和事件
    C#中的特性(Attributes)(翻译)
    gridview和repeater中取得行的序号
    理解 Ajax 及其工作原理,构建网站的一种有效方法
    JS数组对象参考
  • 原文地址:https://www.cnblogs.com/luanxin/p/9607958.html
Copyright © 2011-2022 走看看