数据结构:栈的顺序存储结构及实现

栈的定义和抽象数据类型



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

其抽象数据类型:

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

执行结果:

时间: 2024-10-24 23:08:57

数据结构:栈的顺序存储结构及实现的相关文章

一步一步学习数据结构(三)栈的顺序存储结构实现代码

//栈这种逻辑结构的实现与一般线性表的实现类似,有两种存储方式:顺序存储和链式存储 //先学习顺序存储 //1. #include<stdio.h> #include<stdlib.h> #define null NULL #define SIZE 100 typedef int dataType ; typedef struct { dataType data[SIZE]; int top; }cStack,*cStackPointer; //初始化栈空间 void initSt

Java数据结构系列之——栈(1):栈的顺序存储结构及操作

package Stack; /** * 栈的定义:限定只在表末尾进行增加和删除操作的线性表 * 栈的特点:先进后出FILO(First In Last Out) * 通常我们把允许插入和删除的一段称为栈顶(top),另一端 * 称为栈底,不包含任何元素的栈称为空栈 * 栈的出栈操作我们一般称为进栈或者压栈或者入栈 * 栈的删除操作我们一般称为出栈或者弹栈 * * 这里我们用数组来实现栈的顺序存储结构及各种操作 * @author wl * */ public class MyStack { p

数据结构(六)栈的顺序存储结构

一.栈的定义 1.栈(stack)是限定仅在表尾进行插入和删除操作的线性表. 2.把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何元素的栈称为空栈.栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构. 3.栈的插入操作,叫做进栈(push),也称压栈.入栈:栈的删除操作,叫做出栈(pop),也称弹栈. 4.栈的顺序存储结构:既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化.数组下标为0的一端作为栈底,定义一个top

栈的顺序存储结构及及其实现

由于栈是线性结构的一种,所以,栈也可以通过顺序存储结构实现. 因为,线性表的顺序存储结构是通过数组实现的,所以,栈的顺序存储结构也通过数组实现.不可避免的,要设置栈的最大存储空间.因为,栈只允许在栈顶进行元素的插入与删除操作,所以需要一个指向栈顶的变量top.那么栈的存储结构: typedef int SElemType; typedef struct{     SElemType data[MAXSIZE];     int top; }SqStack; 接着,就是插入一个新的元素e,也就是进

3.1 栈的顺序存储结构

<?php header("content-type:text/html;charset=utf-8"); /** * 栈的顺序存储结构的基本操作 * *包括 * 1.顺序栈的初始化 __contruct() * 2.销毁栈 destroyStack() * 3.清空栈 clearStack() * 4.判断栈是否为空 stackEmpty() * 5.获取栈顶元素 getTop() * 6.进栈操作 push() * 7.出栈操作 pop() * 8.遍历栈元素 travers

栈(顺序存储结构)

堆栈:具有一定操作约束的线性表,只能在一端作插入.删除 具有后入先出的特性(Last In First Out) 分顺序存储结构.链式存储结构两种形式 堆栈的顺序存储结构 通常由一个一维数组和一个栈顶元素变量组成 图解如下: 形式一:构建结构体 0.结构初始化 #define MaxSize ### struct StackNode { ElementType Data[MaxSize]; int top; }; 1.建立空栈 struct StackNode* createStack() {

数据结构(03)_顺序存储结构线性表

本节我们基于前面实现的数据结构类模板基础,继续完成基于顺序存储结构的线性表的实现,话不多说,继承关系图如下: 14.线性表的本质和操作 14.1.线性表的表现形式 零个多多个数据元素组成的集合 数据元素在位置上是有序排列的 数据元素的个数是有限的 数据元素的类型必须相同 14.2.线性表的抽象定义.性质 线性表是具有相同类型的n(>=)个数据元素的有限序列,(a0, a1, a2... an-1),其中ai是表项,n是表长度.性质: a0为线性表的第一个元素,只有一个后继 an-1为线性表的最后

数据结构——线性表顺序存储结构

 关于线性表 线性表是零个或者多个数据元素的集合.它主要有以下三个特征: 1:线性表的数据元素之间是有顺序的. 2:线性表中数据元素个数是有限的. 3:线性表中数据元素数据类型是相同的. 关于线性表的操作,主要有 创建线性表.销毁线性表.清空线性表.将元素插入线性表.将元素从线性表中删除.获取线性表中某个位置的元素.获取线性表的长度. 线性表主要有两种存储结构: 1:线性表的顺序存储结构,c语言中的数组及采用这种方式. 2:线性表的链式存储结构. 关于顺序存储结构 定义: 是指用一段地址连续的内

数据结构 - 线性表顺序存储结构

线性表 线性表是一种典型的线性结构.其基本特点是线性表中的数据元素是有序且是有限的.在这种结构中: ① 存在一个唯一的被称为"第一个"的数据元素: ② 存在一个唯一的被称为"最后一个"的数据元素: ③ 除第一个元素外,每个元素均有唯一一个直接前驱: ④ 除最后一个元素外,每个元素均有唯一一个直接后继. 线性表(Linear List) :是由n(n≧0)个数据元素(结点)a1,a2, -an组成的有限序列.该序列中的所有结点具有相同的数据类型. 线性表中的数据元素