zoukankan      html  css  js  c++  java
  • 堆栈

    1.2堆栈(Stack)及实现

    1.2.1堆栈的定义

    具有一定操作约束的线性表,只在一端(栈顶top)做插入(push)、删除(pop),后进先出(LIFO)

    1.2.2栈的存储实现

    1.2.2.1栈的顺序存储实现

    通常由一个一维数组和一个记录栈顶元素位置的变量组成。

     1 #define MaxSize 100//堆栈元素的最大个数
     2 typedef int ElementType;
     3 typedef struct SNode* Stack;
     4 struct SNode
     5 {
     6     ElementType Data[MaxSize];//存储堆栈元素
     7     int top;//记录栈顶元素的下标
     8 };
     9 Stack S;
    10 
    11 //初始化
    12 Stack CreatStack() {
    13     S = (Stack)malloc(sizeof(SNode));
    14     S->top = -1;//说明堆栈中从0下标开始都没有存储数据
    15     return S;
    16 }
    17 
    18 //是否已满
    19 int IsFull(Stack S) {
    20     return (S->top == MaxSize - 1);
    21 }
    22 
    23 //是否空
    24 int IsEmpty(Stack S) {
    25     return (S->top == -1);
    26 }
    27 
    28 //入栈
    29 void Push(Stack S, ElementType item) {
    30     if (iSFull(S)) {
    31         printf("栈已满");
    32         return;
    33     }
    34     S->top++;//栈顶元素先加1
    35     S->Data[S->top] = item;//栈顶指向的位置存放item
    36     return;
    37 }
    38 
    39 //出栈 同时返回栈顶元素
    40 ElementType Pop(Stack S){
    41     if (IsEmpty(S)) {
    42         printf("栈已空");
    43         return 0;
    44     }
    45     ElementType val = S->Data[S->top];
    46     S->top--;//先取出再释放位置
    47     return val;
    48 }

    1.2.2.2栈的链式存储实现

    栈的链式存储结构实际上就是一个单链表,叫做链栈。插入和删除操作只能在栈顶进行。

    typedef int ElementType;
    typedef struct SNode* Stack;
    
    struct SNode
    {
        ElementType Data;
        Stack Next;//指向下一个结点
    };
    
    Stack S;
    
    //初始化
    Stack CreateStack() {
        Stack S;
        S = (Stack)malloc(sizeof(SNode));
        S->Next = NULL;//建立一个头结点
        return S;
    }
    
    //判断是否为空
    int IsEmpty(Stack S) {
        return (S->Next == NULL);
    }
    
    //入栈
    void Push(Stack S, ElementType item) {
        Stack tmp;//建立一个结点,将结点插入链表
        tmp = (Stack)malloc(sizeof(SNode));
        tmp->Data = item;//将元素值存入结点的数据域
        //链栈栈顶元素是链表头结点,新入栈的结点在栈顶元素后面
        //相当于新入栈的元素总是插在链表的第二个位置上
        tmp->Next = S->Next;
        S->Next = tmp;
    }
    
    //出栈
    ElementType Pop(Stack S) {
        Stack First;//出栈的结点
        ElementType TopVal;//出栈的结点的数据域
        if (IsEmpty(S)) {
            printf("栈已空");
            return 0;
        }
        First = S->Next;//指向待删除的结点
        S->Next = First->Next;
        TopVal = First->Data;
        free(First);
        return TopVal;
    }
    作者:PennyXia
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    7.21 高博教育 数组 内存
    【基础扎实】Python操作Excel三模块
    PAT 甲级 1012 The Best Rank
    PAT 甲级 1011  World Cup Betting
    PAT 甲级 1010 Radix
    链式线性表——实验及提升训练
    循环程序设计能力自测
    链表应用能力自测
    PAT 甲级 1009 Product of Polynomials
    1008 Elevator (20分)
  • 原文地址:https://www.cnblogs.com/PennyXia/p/12591023.html
Copyright © 2011-2022 走看看