数据结构与算法 05 栈与逆波兰表达式

正在学习数据结构与算法,学习资料是小甲鱼的《数据结构和算法》,记录日志



#include "data.h"
#include <stdio.h>
#include <stdlib.h>

int main() {
    LinkStack* L = CreateLinkStack();
    char* p = "12-45+*";
    char* s = (char*)malloc(sizeof(char));

    int* i = (int*)malloc(sizeof(int));
    int* j = (int*)malloc(sizeof(int));
    int* k = (int*)malloc(sizeof(int));
    while(*p != '\0') {
        switch(*p) {
        case '-':
            Pop(L, i);
            Pop(L, j);
            *k = *j - *i;
            Push(L, k);
            break;
        case '+':
            Pop(L, i);
            Pop(L, j);
            *k = *i + *j;
            Push(L, k);
            break;
        case '*':
            Pop(L, i);
            Pop(L, j);
            *k = *i * *j;
            Push(L, k);
            break;
        default:
            *s = *p;
            // 这块不能直接用p,实验是用p不能得到正确的i值
            *i = atof(s);
            Push(L, i);
            break;
        }
        printf("%c\n", *p);
        p++;
    }

    Pop(L, i);
    printf("%d\n", *i);

    return 0;
}

#define OK 1;

typedef struct StackNode{
    int data;
    struct StackNode* next;
} StackNode;

typedef struct LinkStack{
    StackNode* top;
    int count;
} LinkStack;

LinkStack* CreateLinkStack(void);
int Push(LinkStack* L, int* e);
int Pop(LinkStack* L, int* e);

#include "data.h"
#include <stdlib.h>

LinkStack* CreateLinkStack(void){
    LinkStack* L = (LinkStack*)malloc(sizeof(LinkStack));
    L->count = 0;
    L->top = NULL;

    return L;
}

int Push(LinkStack* L, int* e){
    StackNode* p = (StackNode*)malloc(sizeof(StackNode*));
    p->data = *e;
    p->next = L->top;

    L->top = p;
    L->count++;

    return OK;
}

int Pop(LinkStack* L, int* e){
    StackNode* s = L->top;

    *e = s->data;
    L->top = s->next;
    L->count--;
    free(s);

    return OK;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值