zoukankan      html  css  js  c++  java
  • stack

    stack是一种先进后出的数据结构。

    stack主要操作为,入栈,出栈,判断栈空满等。

    1. 数组实现栈

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    
    #define MAX 10
    
    int arr[MAX];
    int pos = 0;
    
    void push(int value)
    {
        arr[pos ++] = value;
    }
    
    int pop(void)
    {
        return arr[-- pos];
    }
    
    bool is_empty(void)
    {
        return pos == 0;
    }
    
    bool is_full(void)
    {
        return pos == MAX;
    }
    
    int main(int argc, char *argv[])
    {
        char ch;
    
        while((ch = getchar()) != '
    ') {
            if (! is_full()) {
                push(ch);
            }
        }
    
        while(! is_empty()) {
            putchar(pop());
        }
        return 0;
    }

    2. 数组栈

    #ifndef _STACK_H_
    #define _STACK_H_
    
    #include <stdbool.h>
    
    #define MAX 10
    
    typedef struct stack {
        int arr[MAX];
        int pos;
    } Stack;
    
    extern void stack_init(Stack *stack);
    extern void stack_push(Stack *stack, int value);
    extern int stack_pop(Stack *stack);
    extern bool stack_is_empty(Stack *stack);
    extern bool stack_is_full(Stack *stack);
    
    #endif    //_STACK_H_
    
    #include "stack.h"
    
    void stack_init(Stack *stack)
    {
        stack->pos = 0;
    }
    
    void stack_push(Stack *stack, int value)
    {
        stack->arr[stack->pos ++] = value;
    }
    int stack_pop(Stack *stack)
    {
        return stack->arr[-- stack->pos];
    }
    bool stack_is_empty(Stack *stack)
    {
        return stack->pos == 0;
    }
    bool stack_is_full(Stack *stack)
    {
        return stack->pos == MAX;
    }
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    
    #include "stack.h"
    
    bool is_digit(char ch)
    {
        if (ch >= '0' && ch <= '9') {
            return true;
        } 
        return false;
    }
    
    int main(int argc, char *argv[])
    {
        char ch;
        Stack s1, s2;
    
        stack_init(&s1);
        stack_init(&s2);
    
        while((ch = getchar()) != '
    ') {
            if (is_digit(ch)) {
                if (! stack_is_full(&s1)) {
                    stack_push(&s1, ch);
                }
            } else {
                if (! stack_is_full(&s2)) {
                    stack_push(&s2, ch);
                }
            }
        }    
    
        while(! stack_is_empty(&s1)) {
            putchar(stack_pop(&s1));
        }
        
        putchar('
    ');
    
        while(! stack_is_empty(&s2)) {
            putchar(stack_pop(&s2));
        }
    
        return 0;
    }

    3. 链表栈

    #ifndef _STACK_H_
    #define _STACK_H_
    
    #include <stdbool.h>
    
    struct node {
        void *data;
        struct node *next;
    };
    
    typedef struct {
        struct node *top;
    } Stack;
    
    extern void stack_init(Stack *stack);
    extern void stack_push(Stack *stack, void *data);
    extern void *stack_pop(Stack *stack);
    extern bool stack_is_empty(Stack *stack);
    extern bool stack_is_full(Stack *stack);
    extern void stack_destroy(Stack *stack,
            void (*destroy)(void *data));
    
    #endif    //_STACK_H_
    
    #include <stdlib.h>
    #include <assert.h>
    
    #include "stack.h"
    
    void stack_init(Stack *stack)
    {
        stack->top = NULL;
    }
    
    static struct node * make_node(void *data)
    {
        struct node *n;
    
        n = malloc(sizeof(struct node));
        assert(n);
        n->data = data;
        n->next = NULL;
    
        return n;
    }
    
    void stack_push(Stack *stack, void *data)
    {
        struct node *n;
        
        n = make_node(data);    
    /*
        if (stack->top == NULL) {
            stack->top = n;
        } else {
            n->next = stack->top;
            stack->top = n;
        }
    */
        n->next = stack->top;
        stack->top = n;
    }
    
    void *stack_pop(Stack *stack)
    {
        void *data;
        struct node *n;
        
        n = stack->top;
        stack->top = n->next;
        data = n->data;
        free(n);
        return data;
    }
    bool stack_is_empty(Stack *stack)
    {
        return stack->top == NULL;
    }
    bool stack_is_full(Stack *stack)
    {
        return false;
    }
    
    void stack_destroy(Stack *stack,
            void (*destroy)(void *data))
    {
        while(! stack_is_empty(stack)) {
            if (destroy) {
                destroy(stack_pop(stack));
            } else {
                stack_pop(stack);
            }
        }    
    }
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    
    #include "stack.h"
    
    void destroy_data(void *data)
    {
        char *p = data;
        free(p);
    }
    
    int main(int argc, char *argv[])
    {
        char ch;
        char *p;
        Stack s;
    
        stack_init(&s);
    
        while((ch = getchar()) != '
    ') {
            p = malloc(sizeof(char));
            assert(p);
            *p = ch;
    
            if (! stack_is_full(&s)) {
                stack_push(&s, p);
            }
        }
    
        while(! stack_is_empty(&s)) {
            p = stack_pop(&s);
            putchar(*p);
            free(p);
        }
        stack_destroy(&s, destroy_data);
        return 0;
    }
  • 相关阅读:
    翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》 第 6 章:值的不可变性
    翻译 | 带你秒懂内存管理 第一部(共三部)
    基于 Electron 的爬虫框架 Nightmare
    微信小程序教学第三章(含视频):小程序中级实战教程:列表静态页面制作
    翻译 | 使用AFrame打造WebVR版《我的世界》
    微信小程序教学第三章第三节(含视频):小程序中级实战教程:视图与数据关联
    翻译 | 玩转 React 表单 —— 受控组件详解
    翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》 第 5 章:减少副作用
    翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》 第 2 章:函数基础
    一张图告诉你移动Web前端所有技术(工程化、预编译、自动化)
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/7487552.html
Copyright © 2011-2022 走看看