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;
    }
    

      

     

  • 相关阅读:
    centos7安装pcntl扩展
    MySQL_数据库命名规范及约定
    tp5命名规范
    PHP易混淆函数的区别及用法汇总(函数和方法的区别)
    Mysql密码安全策略修改
    linux mysql 允许进行远程连接 比如 navicat
    解决 docker run 报错 oci runtime error
    如何删除Git中缓存的用户名和密码
    PHP heredoc 用法
    python日志模块
  • 原文地址:https://www.cnblogs.com/darkchii/p/7341634.html
Copyright © 2011-2022 走看看