栈的顺序存储实现


#include<iostream>
#include<stdlib.h>

using namespace std;

#define STACK_SIZE 100

struct Stack{
    int *top;
    int *base;
    int Size;
}Stack;

/**********************
 * Function Statements
**********************/

bool InitStack(struct Stack &S); //构建栈
bool IsEmpty(struct Stack &S); //判断栈空
bool IsFull(struct Stack &S); //判断栈满
void Push(struct Stack &S, int e); //压栈,插入数据
void Pop(struct Stack &S, int &e); //删除,即弹出数据
bool DestroyStack(struct Stack &S); //销毁栈
bool ClearStack(struct Stack &S); //清空栈
void PrintStack(struct Stack &S); //打印栈中元素,即输出

/**********************
       * Main *
***********************/

int main()
{
    struct Stack S;
    int b, n;
    if(InitStack(S)==false){
        cout << "Init Stack error!" << endl;
        exit(0);
    }
    cout << "push a data into stack:" << endl;

    cin >> n;

    //压栈
    cout << "压栈操作" << endl;
    while(n--){
        Push(S, n);
        PrintStack(S);
    }

    //弹栈
    cout << "弹栈操作" << endl;
    while(n<4){
        Pop(S, b);
        PrintStack(S);
        n++;
    }

    //清栈
    cout << "清栈操作" << endl;
    if(ClearStack(S))
        PrintStack(S);

    //销毁栈
    cout << "销毁栈操作" << endl;
    DestroyStack(S);
    cout << "S.base = " << S.base << ";  " <<"S.top = " << S.top << ";  "
         << "S.Size = " << S.Size << endl;

    return 0;
}

/*******************************
 * PrintStack
 * 打印栈中的元素,自顶向下显示
 * 即从栈尾输出到栈首
*******************************/

void PrintStack(struct Stack &S){
    int n = S.top - S.base;
    int index;
    //若栈空则输出
    if(!n){
        cout << ".................................." << endl;
        cout << "Stack is Empty..."<<endl;
        cout << ".................................." << endl;
        return;
    }
    //非空时
    cout << ".................................." << endl;
    cout << "栈中的数据(从栈顶元素开始向下显示)" << endl;
    for(index = 1; index<=n; ++index){
        cout << *(S.top - index) << " ";
    }
    cout << endl;
}

/*******************************
 *InitStack
 *动态分配内存
 *并对栈的属性初始化
*******************************/

bool InitStack(struct Stack &S){
    S.base = (int* ) malloc (STACK_SIZE *sizeof(Stack));
    if(S.base == NULL){
        cout << "malloc stack error" << endl;
        return false;
    }
    S.top = S.base;
    S.Size = STACK_SIZE;
    return true;
}

/*******************************
 *ClearStack
 *清空栈内数据
*******************************/

bool ClearStack(struct Stack &S){
    S.top = S.base;
    return true;
}

/*******************************
 *DestroyStack
 *销毁栈S,释放内存
 *并将指针属性置空
 *防止悬浮指针产生
*******************************/

bool DestroyStack(struct Stack &S){
    free(S.base);
    S.base = NULL; //不用的指针一定用指向空
    S.top = NULL;  //防止悬浮指针的产生
    S.Size = 0;
    return true;
}

/*******************************
 *IsEmpty
 *判断栈是否为空
 *即判断S.top == S.base ?
 *若S.top == S.base 则表示栈空
*******************************/

bool IsEmpty(struct Stack &S){
    if(S.top == S.base)
        return true;
    else
        return false;
}

/******************************************
 *IsFull
 *判断栈是否存满
 *A = S.top - S.base 代表此时栈中所有元素
 *B = S.Size 表示栈被分配的空间
 *若A >= B, 则表示栈溢出
******************************************/

bool IsFull(struct Stack &S){
    int A = S.top - S.base;
    int B = S.Size;
    if(A >= B){
        cout << "Stack is Full" << endl;
        return true;
    }
    else
        return false;
}

/************************************************************
 *Push
 *压栈操作
 *栈是特殊的线性表,其不支持随机访问,因此只能按照顺序存储。
 *例如:子弹夹上子弹(该例子与本实现不同的是
 *++子弹夹栈顶指针保持不变,栈底指针游动。
 *++本程序实现的是栈底指针不变,栈顶指针游动。)

*************************************************************/

void Push(struct Stack &S, int e){
    if(!IsFull(S)){
        *(S.top) = e;
        S.top ++;
    }
}

/******************************************************************
 * Pop
 * 弹栈操作
 *     栈是特殊的线性表,其不支持随机访问,因此只能按照顺序存储。
 *     例如:子弹夹推出子弹(该例子与本实现不同的是
 *            ++子弹夹栈顶指针保持不变,栈底指针游动。
 *            ++本程序实现的是栈底指针不变,栈顶指针游动。)
*******************************************************************/

void Pop(struct Stack &S, int &e){
    if(IsFull(S)){
        cout << "Pop error" << endl;
    }
    else{
        e = *(S.top - 1);
        S.top --;
    }
}

点击打开链接

时间: 2024-10-03 14:56:06

栈的顺序存储实现的相关文章

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

//栈这种逻辑结构的实现与一般线性表的实现类似,有两种存储方式:顺序存储和链式存储 //先学习顺序存储 //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

栈的顺序存储 - 设计与实现 - API实现

Stack基本概念 栈是一种 特殊的线性表 栈仅能在线性表的一端进行操作 栈顶(Top):同意操作的一端 栈底(Bottom):不同意操作的一端 Stack的经常使用操作 创建栈 销毁栈 清空栈 进栈 出栈 获取栈顶元素 获取栈的大小 栈模型和链表模型关系分析 栈的顺序存储设计与实现 // seqlist.h // 顺序存储结构线性表的API声明 #ifndef __MY_SEQLIST_H__ #define __MY_SEQLIST_H__ typedef void SeqList; typ

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

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

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

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

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

栈的定义和抽象数据类型 栈是限定仅在表尾进行插入和删除操作的线性表.所以说栈也是线性表,栈元素具有线性关系,即前驱后继关系. 其抽象数据类型: ADT 栈(Stack) Data 同线性表,元素具有相同的类型,相邻元素具有前驱和后继关系. Operation InitStack(*S): 初始化操作,建立一个空栈S. DestroyStack(*S): 若栈存在,则销毁它. ClearStack(*S): 将栈清空. StackEmpty(S): 若栈为空,返回true,否则返回false. G

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

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

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

C++栈的顺序存储和链式存储的实现

栈是最常见的数据结构,其特点是后进先出(Last In First Out)也是链表的特殊形式,所以和链表一样,有两种存储方式,第一是顺序存储的栈,方便快速读写数据,但是栈的长度必须先固定:第二种是链式存储的栈,可以不用定义栈的长度,可以大量插入数据,如果不是物理内存使用完的话,可以存储大量的数据. 首先,顺序存储的栈的实现,代码如下: #pragma once #define MAXSIZE 10 template<typename EleType> class OrderStack { p

栈(顺序存储结构)

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