栈的实现

一、栈的定义

栈(stack):是限定仅在表位进行插入或者删除操作的线性表。即先进后出
表尾端成为栈顶(top)
表头端称为栈底(bottom)

二、栈的顺序存储结构

stacksize 用于指示栈大小

三、栈顶指针指向

非空栈中栈顶指针始终指向栈顶元素的下一个位置

四、栈的操作定义

//1、创建栈并初始化栈
void InitStack(pSqStack S);
//2、销毁栈S
void DestroyStack(pSqStack S);
//3、把S置为空栈
void ClearStack(pSqStack S);
//4、若栈S为空栈,则返回true,否则返回false
bool StackEmpty(pSqStack S);
//5、返回S的元素个数,即栈的长度
int StackLength(pSqStack S);
//6、获取栈顶元素
bool GetTop(pSqStack S, SElemType &e);
//7、压栈
void Push(pSqStack S, SElemType e);
//8、出栈
bool Pop(pSqStack S, SElemType &e);
//9、栈遍历
void StackTraverse(pSqStack S);

五、栈的操作实现

1、创建栈并初始化栈

void InitStack(pSqstack S)
{   // 构造一个空栈SS->bottom = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));if (S->bottom == NULL)// 存储分配失败{exit(-1);}S->top = S->bottom;S->stacksize = STACK_INIT_SIZE;
}

2、销毁栈

void DestroyStack(pSqStack S)
{ // 销毁栈S,S不再存在free(S->bottom);S->bottom = NULL;S->top = NULL;S->stacksize = 0;
}

3、把S置为空栈

void ClearStack(pSqStack S)
{ S->top = S->bottom;
}

4、判断栈是否为空

//4、若栈S为空栈,则返回true,否则返回false
bool StackEmpty(pSqStack S)
{ if (S->top == S->bottom)return true;elsereturn false;
}

5、返回S的元素个数,即栈的长度

int StackLength(pSqStack S)
{ return S->top - S->bottom;
}

6、获取栈顶元素

bool GetTop(pSqStack S, SElemType &e)
{ // 若栈不空,则用e返回S的栈顶元素,并返回true;否则返回falseif (S->top > S->bottom){e = *(S->top - 1);return true;}elsereturn false;
}

7、压栈

void Push(pSqStack S, SElemType e)
{ // 插入元素e为新的栈顶元素if (S->top - S->bottom >= S->stacksize) // 栈满,追加存储空间{S->bottom = (SElemType *)realloc(S->bottom, (S->stacksize + STACK_INCREMENT) * sizeof(SElemType));//扩充栈if (S->bottom == NULL)exit(-1); // 存储分配失败S->top = S->bottom + S->stacksize;//栈顶指针为 新地址的首地址+原栈大小S->stacksize += STACK_INCREMENT;//扩充后栈的大小}*(S->top)++ = e;//将数据e压入栈,栈顶指针加1 等价于*(S->top)= e;S->top=S->top+1;
}

8、出栈

bool Pop(pSqStack S, SElemType &e)
{ // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORif (S->top == S->bottom)//栈为空return false;e = *--S->top;//栈不为空返回栈顶元素,将栈顶数据赋值给e出栈,栈顶指针减1 等价于S->top=S->top-1,e = *(S->top);return true;
}

9、栈遍历

void StackTraverse(pSqStack S)
{ // 从栈底到栈顶依次遍历栈中每个元素SElemType * p= S->bottom;while (S->top > p){  printf("   %d",*p);p++;}printf("\n");
}

最后给出完整代码

// 栈.cpp
//#include <stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define STACK_INIT_SIZE 10//存储空间初始分配量
#define STACK_INCREMENT 2//存储空间分配增量
typedef int SElemType;
typedef struct SqStack{//顺序栈SElemType *bottom;//在栈构造之前和销毁之后,bottom的值为NULLSElemType *top;//栈顶指针int stacksize;//当前已分配的存储空间,以SElemtype大小为单位
}SqStack,*pSqStack;
//1、创建栈并初始化栈
void InitStack(pSqStack S);
//2、销毁栈S
void DestroyStack(pSqStack S);
//3、把S置为空栈
void ClearStack(pSqStack S);
//4、若栈S为空栈,则返回true,否则返回false
bool StackEmpty(pSqStack S);
//5、返回S的元素个数,即栈的长度
int StackLength(pSqStack S);
//6、获取栈顶元素
bool GetTop(pSqStack S, SElemType &e);
//7、压栈
void Push(pSqStack S, SElemType e);
//8、出栈
bool Pop(pSqStack S, SElemType &e);
//9、栈遍历
void StackTraverse(pSqStack S);int main()
{SqStack S ;InitStack(&S);printf("S.bottom = %p\n S.top = %p\n S.stacksize = %d\n",S.bottom,S.top,S.stacksize);DestroyStack(&S);printf("S.bottom = %p\n S.top = %p\n S.stacksize = %d\n", S.bottom, S.top, S.stacksize);InitStack(&S);if (StackEmpty(&S)){printf("栈为空栈\n");}else{printf("栈不为空栈\n");}for (int i = 0; i < 10; i++){Push(&S, 2 * i);}printf("栈内的元素有:\n");StackTraverse(&S);SElemType e;printf("栈的大小为%d\n", StackLength(&S));int Length = StackLength(&S);for (int j = 0; j < Length; j++){Pop(&S, e);printf("出栈第 %d 个元素值为 %d \n",j+1, e);}printf("栈的大小为%d\n", StackLength(&S));return 0;
}//1、创建栈并初始化栈
void InitStack(pSqStack S)
{   // 构造一个空栈SS->bottom = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));if (S->bottom == NULL)// 存储分配失败{exit(-1);}S->top = S->bottom;S->stacksize = STACK_INIT_SIZE;
}//2、销毁栈S
void DestroyStack(pSqStack S)
{ // 销毁栈S,S不再存在free(S->bottom);S->bottom = NULL;S->top = NULL;S->stacksize = 0;
}
//3、把S置为空栈
void ClearStack(pSqStack S)
{ S->top = S->bottom;
}//4、若栈S为空栈,则返回true,否则返回false
bool StackEmpty(pSqStack S)
{ if (S->top == S->bottom)return true;elsereturn false;
}
//5、返回S的元素个数,即栈的长度
int StackLength(pSqStack S)
{ return S->top - S->bottom;
}
//6、获取栈顶元素
bool GetTop(pSqStack S, SElemType &e)
{ // 若栈不空,则用e返回S的栈顶元素,并返回true;否则返回falseif (S->top > S->bottom){e = *(S->top - 1);return true;}elsereturn false;
}
//7、压栈
void Push(pSqStack S, SElemType e)
{ // 插入元素e为新的栈顶元素if (S->top - S->bottom >= S->stacksize) // 栈满,追加存储空间{S->bottom = (SElemType *)realloc(S->bottom, (S->stacksize + STACK_INCREMENT) * sizeof(SElemType));//扩充栈if (S->bottom == NULL)exit(-1); // 存储分配失败S->top = S->bottom + S->stacksize;//栈顶指针为 新地址的首地址+原栈大小S->stacksize += STACK_INCREMENT;//扩充后栈的大小}*(S->top)++ = e;//将数据e压入栈,栈顶指针加1 等价于*(S->top)= e;S->top=S->top+1;
}
//8、出栈
bool Pop(pSqStack S, SElemType &e)
{ // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORif (S->top == S->bottom)//栈为空return false;e = *--S->top;//栈不为空返回栈顶元素,将栈顶数据赋值给e出栈,栈顶指针减1 等价于S->top=S->top-1,e = *(S->top);return true;
}
//9、栈遍历
void StackTraverse(pSqStack S)
{ // 从栈底到栈顶依次遍历栈中每个元素SElemType * p= S->bottom;while (S->top > p){  printf("   %d",*p);p++;}printf("\n");
}

数据结构笔记(七)-- 顺序栈相关推荐

  1. 【数据结构笔记】3.栈和队列

    文章目录 第3章 栈和队列 3.1 栈 3.1.1 栈的基本概念 1.栈的定义 2.栈的基本操作 3.1.2 栈的顺序存储结构 1.顺序栈的实现 2.顺序栈的基本运算 3.共享栈 3.1.3 栈的链式 ...

  2. 数据结构基础(6) --顺序栈的设计与实现

    栈是一种只允许在一端进行插入或删除操作的线性表.其特点为:先进后出(FILO)/后进先出(LIFO); 栈 VS. 队列 栈和队列都是动态集合, 但在栈中, 可以去掉的是最近插入的那一个,:栈实现了一 ...

  3. 【数据结构学习】顺序栈 C语言

    #include <stdio.h> #include <stdlib.h> #define ERROR 0 #define OK 1 #define STACK_INT_SI ...

  4. 数据结构学习笔记——栈的基本知识和顺序存储结构实现栈(顺序栈)

    目录 一.栈 (一)栈的概念 (二)栈的排列 (三)共享栈 (四)栈的常见应用 二.顺序栈的定义 三.顺序栈的初始化 四.判断顺序栈是否为空栈 五.判断顺序栈是否为满栈 六.进栈(插入操作) 七.出栈 ...

  5. 卜若的代码笔记-数据结构系列-第十章:栈一.顺序栈(数组栈)

    1.栈有两种写法,一种是以数组为躯干的顺序栈,一种是以链表为躯干的链式栈. 1.1栈的操作 1.1.1 出栈pop()函数 允许栈出,栈出之后,顶数据有移除操作. 时间复杂度o(1) 1.1.2 入栈 ...

  6. 数据结构笔记(王道考研) 第七章:查找

    大部分内容基于中国大学MOOC的2021考研数据结构课程所做的笔记,该课属于付费课程(不过盗版网盘资源也不难找...).后续又根据23年考研的大纲对内容做了一些调整,将二叉排序树和平衡二叉树的内容挪到 ...

  7. 数据结构Java实现05----栈:顺序栈和链式堆栈

    一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  8. 数据结构 :: 顺序栈与链式栈的设计与实现

    数据结构 :: 双链表的设计与实现 说明:本文属于读书笔记.笔者将以讲述的方式表达全片文章.故文中提到的某些字词是非正式术语,只是笔者本人的理解性词语. 前言:本文将对顺序栈与链式栈进行设计与实现!其 ...

  9. 【Python数据结构系列】❤️《栈(顺序栈与链栈)》——❤️知识点讲解+代码实现

    灵魂拷问:为什么要学数据结构? 数据结构,直白地理解,就是研究数据的存储方式.数据存储只有一个目的,即为了方便后期对数据的再利用.因此,数据在计算机存储空间的存放,决不是胡乱的,这就要求我们选择一种好 ...

最新文章

  1. Nginx中worker_connections的问题
  2. DHCP欺骗(DHCP Sproofing)
  3. pandas把频数统计转换成数据表
  4. win7下注册一个com失败,权限不够
  5. 【DP】【树状数组】免费馅饼(luogu 7302/金牌导航 数据结构优化DP-4)
  6. mysql join 联合查询,MySQL连接(join)查询
  7. BFC 神奇背后的原理
  8. [重拾Oracle - 00]既然青春留不住,那么还是要学习-----工具:在线Oracle(Oracle Live SQL)...
  9. 鸿蒙轻内核M核源码分析:数据结构之任务排序链表
  10. noip2013day1模拟赛
  11. python中and和的区别_python中逻辑与或(and、or)和按位与或异或(amp;、|、^)区别...
  12. 朗文3000词汇表带音标_朗文少儿英语2A-Unit3知识归纳(单词含音标版
  13. 瞎搞无人机之无刷电机
  14. 斯坦福句法分析 java_使用Stanford Parser进行句法分析
  15. steam linux 安装目录,「Linux」- 安装 Steam 客户端 @20210219
  16. 那些年啊,那些事——一个程序员的奋斗史 ——33
  17. 把多列的迭代次数问题化简为单列问题
  18. python数学符号读法大全_【常用】数学符号及读法大全
  19. python显示变量值_Python 中如何打印变量值
  20. 失联8分钟后现神秘“第7次握手” 澳两次发现疑似黑匣子信号 搜救区域最深5000米

热门文章

  1. bzoj 3173: [Tjoi2013]最长上升子序列(离线二分+树状数组)
  2. bzoj 1681: [Usaco2005 Mar]Checking an Alibi 不在场的证明(BFS)
  3. Visdom:Python可视化神器
  4. 贺利坚老师汇编课程34笔记:SI和DI复制字符串
  5. 有关8086必须记住的几个数(持续更新)
  6. (1)什么是socket(套接字)
  7. mysql-5.7 group commit 详解
  8. Min(BZOJ 1441)
  9. ubuntu下安装beanstalkd
  10. 珍惜生命 远离中国足球