zoukankan      html  css  js  c++  java
  • ArrayStack(栈)

      顺序栈即数组型的栈。什么是栈呢?简单来说就像一个刚好装的下乒乓球大小的球筒,假设不能暴力打开球筒且只有一端有出口,那你放入或取出里面的球的操作都只能在一端进行,并且把球放进去或取出来都是由顺序决定的,也就是说你只能从里面没有球或空间足够的时候把球放进去,然后需要的时候再从最外面的那个球拿出一个才能再拿里面的,这就是后进先出(LILO - last in last out),栈的原理就是这么回事。其本质基本上就是一个顺序储存结构,也就是一个线性表,所以栈是前驱后继的关系的线性结构。人们口中常说的堆栈一般就是指栈,而不是堆和栈。

      栈的应用也很重要,比如做递归的时候就是一个栈的原理、符号的匹配问题、后缀表达式等等。

      code:

    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    
    #define EmptyToStack -1
    #define MAXSIZE 500
    
    #define TRUE 1
    #define FALSE 0;
    
    typedef int ElemType;
    typedef int Status;
    
    typedef struct
    {
        ElemType * data;
        int top;
    }Stack;
    
    Stack * CreateStack();
    Status IsEmpty();
    Status IsFull();
    Status Push();
    Status Pop();
    int Top();
    int StackLength();
    
    Stack * CreateStack(void)
    {
        Stack * S;
        S = (Stack *)malloc(sizeof(Stack));
        S -> data = (ElemType *)malloc(sizeof(ElemType));
        S -> top = EmptyToStack;
        return S;
    }
    
    Status IsEmpty(Stack * S)
    {
        return S -> top == EmptyToStack;
    }
    
    Status IsFull(Stack * S)
    {
        return S -> top == MAXSIZE;
    }
    
    Status Push(Stack * S, ElemType Elem)
    {
        if(IsFull(S))
            return FALSE;
        S -> data[++ S -> top] = Elem;
        return TRUE;
    }
    
    Status Pop(Stack * S)
    {
        if(IsEmpty(S))
            return FALSE;
        S -> top --;
        return TRUE;
    }
    
    int Top(Stack * S)
    {
        return S -> top;
    }
    
    int StackLength(Stack * S)
    {
        return S -> top + 1;
    }
    
    int main(void)
    {
    
        ElemType e;
        Stack * p;
        char c;
        int i;
    
        p = CreateStack();
    
        puts("1) 进栈        2) 出栈");
        puts("3) 遍历栈    4) 返回栈顶元素");
        puts("5) 清空栈    6) 当前栈的长度");
        puts("q) 退出");
        while((c = getch()) != 'q')
        {
            if(c == '1')
            {
                puts("请输入数据:");
                scanf("%d",&e);
                Push(p, e);
            }
            if(c == '2')
            {
                puts("当前栈顶元素为:");
                printf("%d
    ",p -> data[Top(p)]);
    
                Pop(p);
    
                puts("当前栈顶元素为:");
                printf("%d
    ",p -> data[Top(p)]);
            }
            if(c == '3')
            {
                puts("显示数据:");
                for(i = Top(p); i > EmptyToStack; i--)
                {
                    printf("%d -> ",p -> data[i]);
                }
                printf("NULL
    ");
            }
            if(c == '4')
            {
                puts("当前栈顶元素为:");
                printf("%d
    ",p -> data[Top(p)]);
            }
            if(c == '5')
            {
                do Pop(p);
                while(p -> top != EmptyToStack);
    
                if(!IsEmpty(p))
                    puts("ERROR!
    ");
            }
            if(c == '6')
            {
                printf("当前栈长: %d
    ",StackLength(p));
            }
        }
        return 0;
    }
    

      

     

  • 相关阅读:
    Vue(小案例_vue+axios仿手机app)_go实现退回上一个路由
    nyoj 635 Oh, my goddess
    nyoj 587 blockhouses
    nyoj 483 Nightmare
    nyoj 592 spiral grid
    nyoj 927 The partial sum problem
    nyoj 523 亡命逃窜
    nyoj 929 密码宝盒
    nyoj 999 师傅又被妖怪抓走了
    nyoj 293 Sticks
  • 原文地址:https://www.cnblogs.com/darkchii/p/7341634.html
Copyright © 2011-2022 走看看