zoukankan      html  css  js  c++  java
  • 0x00数据结构——C语言实现(栈+后缀表达式计算)

    0x00数据结构——C语言实现(栈)

    栈的实现

    /*
     栈(tack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶(top)。
     对栈的基本操作有Push(进栈)和Pop(出栈)。
    
     Functions:
     (在链表中增加附加头结点的版本)
        创建一个空栈
        将栈置为空
        计算栈长度
        返回栈的地址
        栈push操作函数
        栈pop函数
        取栈顶元素Top函数
        判断栈空,空返回真,否则返回假
        输出
    
    */
    
    #ifndef STACK_H
    #define STACK_H
    
    
    #define MAXLEN 100
    typedef enum {
        false = 0,
        true
    } BOOL;
    
    //数据结构。
    struct node;
    typedef struct node node;
    typedef struct node *to_node;
    typedef to_node pos;
    
    struct stack_node;
    typedef struct stack_node stack_node;
    typedef stack_node *stack;
    
    
    //创建一个空栈
    stack create_stack(void);
    
    //将栈置为空
    BOOL set_empty(stack s);
    
    //计算栈长度
    int calc_length(stack s);
    
    
    //栈push操作函数
    int push(stack s, int x);
    
    //栈pop函数
    int pop(stack s);
    
    //取栈顶元素Top函数
    int get_val(stack s);
    
    //判断栈空,空返回真,否则返回假
    BOOL is_empty(stack s);
    
    //输出
    void output(stack s);
    
    #endif
    #include "stack.h"
    #include <stdio.h>
    #include <stdlib.h>
    
    
    /*
    struct node;
    typedef struct node node;
    typedef struct node *to_node;
    typedef to_node pos;
    
    struct stack_node;
    typedef struct stack_node stack_node;
    typedef stack_node *stack;
    */
    struct node {
        int val;
        struct node *next;
    };
    struct stack_node {
        int capacity;
        struct node *top;
    };
    /*
        用链表来实现栈,这里设计一个额外的栈头节点,该节点指向栈顶(便于进栈和出栈)
    */
    //创建一个空栈
    stack create_stack(void)
    {
        stack tmp = (stack)malloc(sizeof(stack_node));
        if(tmp != NULL) {
            tmp->top = NULL;
            tmp->capacity = 0;
        }
        return tmp;
    }
    
    //将栈置为空
    BOOL set_empty(stack s)
    {
        pos tmp;
        while(s->capacity != 0) {
            tmp = s->top;
            s->top = tmp->next;
            free(tmp);
            (s->capacity)--;
        }
        return true;
    }
    
    //计算栈长度
    int calc_length(stack s)
    {
        return s->capacity;
    }
    
    
    //栈push操作函数
    int push(stack s, int x)
    {
        node *tmp = (node *)malloc(sizeof(node));
        tmp->val = x;
        tmp->next = s->top;
        s->top = tmp;
        (s->capacity)++;
        return x;
    }
    
    //栈pop函数
    int pop(stack s)
    {
        node *tmp;
        int r = 0;
        tmp = s->top;
        s->top = tmp->next;
        (s->capacity)--;
        r = tmp->val;
        free(tmp);
        return r;
    }
    
    //取栈顶元素Top函数
    int get_val(stack s)
    {
        return s->top->val;
    }
    
    //判断栈空,空返回真,否则返回假
    BOOL is_empty(stack s)
    {
        return (s->capacity == 0);
    }
    
    //输出
    void output(stack s)
    {
        pos tmp = s->top;
        while(tmp != NULL) {
            printf("%d->", tmp->val);
            tmp = tmp->next;
        }
        printf("|
    ");
    }

    利用栈进行后缀表达式的计算

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include "stack.h"
    
    
    int main()
    {
    //  后缀表达式的计算
    
        stack s;
        int i = 0, len = 0;
        int tmp1, tmp2;
        int op;
    //  char in[100] = {0};
        char in[] = {'6','5','2','3','+','8','*','+','3','+','*'};
        s = create_stack();
    //  while((in[i] = getchar())!=EOF) {
    //      i++;
    //  }
    
        len = strlen(in);
    
        for(i = 0; i<len; i++) {
            tmp1 = in[i];
            if(tmp1=='+' || tmp1=='-' || tmp1 == '*' || tmp1 == '/') {
                op = tmp1;
                tmp1 = pop(s);
                tmp2 = pop(s);
                switch(op) {
                    case '+': push(s, tmp1+tmp2);break;
                    case '-': push(s, tmp1-tmp2);break;
                    case '*': push(s, tmp1*tmp2);break;
                    case '/': push(s, tmp1/tmp2);break;
                    default: break;
                }
            } else if(isdigit(tmp1)) {
                push(s,tmp1-48);
            }
            output(s);
        }
    
        output(s);
        return 0;
    }

    实验结果

    6->|
    5->6->|
    2->5->6->|
    3->2->5->6->|
    5->5->6->|
    8->5->5->6->|
    40->5->6->|
    45->6->|
    3->45->6->|
    48->6->|
    288->|
    288->|
    Time elapsed: 000:00:047
    Press any key to continue
  • 相关阅读:
    JeePlus:代码生成器
    JeePlus:API工具
    Java实现 洛谷 P1023 税收与补贴问题
    Java实现 洛谷 P1023 税收与补贴问题
    Java实现 洛谷 P1023 税收与补贴问题
    Java实现 洛谷 P1328 生活大爆炸版石头剪刀布
    Java实现 洛谷 P1328 生活大爆炸版石头剪刀布
    Java实现 洛谷 P1328 生活大爆炸版石头剪刀布
    Java实现 洛谷 P1328 生活大爆炸版石头剪刀布
    Java实现 洛谷 P1328 生活大爆炸版石头剪刀布
  • 原文地址:https://www.cnblogs.com/born2run/p/9581342.html
Copyright © 2011-2022 走看看