zoukankan      html  css  js  c++  java
  • 数据结构:栈的顺序存储结构及实现

    栈的定义和抽象数据类型


    栈是限定仅在表尾进行插入和删除操作的线性表。所以说栈也是线性表,栈元素具有线性关系,即前驱后继关系。

    其抽象数据类型:

    ADT 栈(Stack)
    Data 
        同线性表,元素具有相同的类型,相邻元素具有前驱和后继关系。
    Operation
        InitStack(*S):        初始化操作,建立一个空栈S。
        DestroyStack(*S):     若栈存在,则销毁它。
        ClearStack(*S):        将栈清空。
        StackEmpty(S):        若栈为空,返回true,否则返回false。
        GetTop(S,*e):         若栈存在且非空,用e返回S的栈顶元素。
        Push(*S,e):            若栈存在,插入新元素e到栈S中并成为栈顶元素。
        Pop(*S,*e):            删除栈S中栈顶元素,并用e返回其值。
        StackLength(S):        返回栈S中元素个数。
    endADT

    既然栈是顺序表的特例,那么先来看栈的顺序存储结构:顺序栈。定义一个top变量来指示栈顶元素在数组中的位置。既然top是数组的下标那么top的范围就是top属于[0, StackSize-1]。所以当栈存在一个元素的时候,top等于0,因此通常把空栈的判定条件定为top等于-1。

    若存在一个栈,StackSize是5,三种情况的示意图:

    栈的顺序存储结构的实现


    #include <iostream>
    #include <stdlib.h>
    using namespace std;
    
    #define MAXSIZE 20
    
    typedef int SElemType;
    typedef struct 
    {
        SElemType data[MAXSIZE];
        int top;//栈顶指针
    }SqStack;
    
    /*初始化一个空栈*/
    bool InitStack(SqStack *s)
    {
        s->top = -1;
        return true;
    }
    /*将栈清空*/
    bool ClearStack(SqStack *s)
    {
        s->top = -1;
        return true;
    }
    /*判断栈是否为空*/
    bool IsStackEmpty(SqStack s)
    {
        if(s.top == -1)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    /*返回栈中元素的个数*/
    int StackLength(SqStack s)
    {
        cout << "Stack Length : ";
        return s.top + 1;
    }
    
    /*获取栈顶元素*/
    bool GetTop(SqStack s, SElemType *e)
    {
        if(s.top != -1)
        {
            *e = s.data[s.top];
            return true;
        }
        cout << "Get Top Item " << *e << endl;
        return false;
    }
    /*插入新元素到栈中,并成为栈顶元素*/
    bool Push(SqStack *s, SElemType e)
    {
        cout << "Push Item  " << e << endl;
        if(s->top == MAXSIZE - 1)
        {
            return false;
        }
        s->top++;
        s->data[s->top] = e;
    
        return true;
    }
    
    /*删除栈顶元素,用e返回取值*/
    bool Pop(SqStack *s, SElemType *e)
    {
        if(s->top == -1)
        {
            return false;
        }
        *e = s->data[s->top];
        s->top--;
        cout << "Pop Item  " << *e << endl;
        return true;
    }
    /*遍历栈中的元素,这个方法不是栈的操作,只是调试的时候观察数据*/
    bool StackTraverse(SqStack s)
    {
        cout << "Traverse Stack ..." << endl;
        if(s.top == -1)
        {
            return false;
        }
        for(int i = s.top; i >=0; i--)
        {
            cout << s.data[i] << ' ';
        }
        cout << endl;
    
        return true;
    }
    
    
    void main(void)
    {
        SqStack sqStack;
        InitStack(&sqStack);
    
        for(int i = 0; i < 10; i++)
        {
            Push(&sqStack, i);
        }
        StackTraverse(sqStack);
    
        int result;
        Pop(&sqStack, &result);
        StackTraverse(sqStack);
    
        GetTop(sqStack, &result);
    
        if(!IsStackEmpty(sqStack))
        {
            cout << StackLength(sqStack) <<endl;
        }
    
        ClearStack(&sqStack);
    
        system("pause");
    }

    执行结果:

    捕获

  • 相关阅读:
    js 获取当前时间
    html5拨打电话及发短信
    ::before和::after伪元素的使用
    vue单页面应用刷新网页后vuex的state数据丢失问题以及beforeunload的兼容性
    CSS3径向渐变实现优惠券波浪造型
    iOS 幻灯片的自动循环滚动
    iOS 编译正常,但无法运行到真机和模拟器上,Choose a destination with a supported architecture in order to run on this device.
    iOS webView抓取改变js的alertView
    iOS 创建单例的方法
    webView图片点击可以实现预览效果
  • 原文地址:https://www.cnblogs.com/stemon/p/4281524.html
Copyright © 2011-2022 走看看