数据结构遍历顺序栈_数据结构:顺序栈的实现

article/2025/8/16 9:07:49

数据结构:顺序栈的实现

1、快速开始

栈是一种遵循元素后进(Push)先出(Pop)规则的线性表,即最后加入的元素最先出来,它的实现可以用数组或者链表。

8de5491417835d66f028be42c3ecb431.png

它的特点如下:

后入先出,先入后出。

除了头尾节点之外,每一个元素有一个前驱,有一个后继。

2、实现栈

我们已经说过了,栈是一种线性表,故其底层是基于数组或者链表的。那么,我们的重点是维护一种规则,即后进先出。

我们始终要有一个变量L来记录最后一个元素的位置:

当压入时,将新元素插入到L位置之后,然后更新L,即L+1.

94ba735053f70b3ad55d136faaeebebb.png

当弹出时,将L位置元素进行删除,然后更新L,即L-1。

d7b9b2e7f7d6f4a6ad56315c797b8dd2.png

也正是因为,我们使用的是线性表,正好可以利用其尺寸来表示L,即线性表的大小可以表示最后一个元素的位置。

2.1、栈的实现

class MyStack {

private List data; // 存储元素

public MyStack() {

data = new ArrayList<>();

}

/**插入一个元素到栈中. */

public void push(int x) {

data.add(x);

}

/**检查是否为空 */

public boolean isEmpty() {

return data.isEmpty();

}

/**到达栈顶. */

public int top() {

return data.get(data.size() - 1);

}

/** 删除一个元素. 操作成功返回true. */

public boolean pop() {

if (isEmpty()) {

return false;

}

data.remove(data.size() - 1);

return true;

}

};

3、C语言版本实现

3.1、对栈的结构定义:

typedef struct

{

int *base;

int *top;

int stacksize;

}SqStack;

说明:

1.base表示栈底指针,在判断出栈、初始化和重新分配空间的时候需要用到。

2.top表示栈顶指针,是栈最关键和核心的组成,入栈时top向上移动,出栈时top向下移动。

3.此处的stacksize并不表示当前的栈中的元素数量,而是表示栈的容量,也就是能装多少个元素。

3.2、初始化栈:

int initStack(SqSatck *S)

{

S->base=(int*)malloc(100*sizeof(int));

if(!S)

return 0; //0代表操作失败

S->top=S->base;

stacksize=100;

return 1; //1代表操作完成

}

说明:

1.顺序栈初始化无非就是给栈分配连续的内存空间,base是栈底指针,在上面提到过,它用来指示一段连续的内存空间的首地址,也就是用来初始化。

2.分配空间不意味着一定会有那么多空间,所以判断也不可缺少。

3.分配空间后,base和top的地址应该一致,此时top还没有移动。

3.3、压栈

int push(SqStack * S,int elem)

{

if(S->top-S->base>=S->stacksize)

{

S->base=(SElemType *)

realloc(S->base,(S->stacksize+10)*sizeof(SElemType)); //10代表增量,你可以使用宏定义,方便后续修改。

if(!S->base)

return 0;

S->top=S->base+S->stacksize;

S->stacksize+=10

}

*S->top++=elem;

return 1;

}

说明:

1.压栈是栈的核心操作,关键步骤无非是*S->top++=elem;但是在进行此步操作时,一定要判断栈是否超出容量。

2.如果栈超出容量,则要在进行原空间的基础上重新分配空间,realloc是关键的命令。

realloc

原型:extern void *realloc(void *mem_address, unsigned int newsize);

用法:#include 有些编译器需要#include

功能:改变mem_address所指内存区域的大小为newsize长度。

说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

当内存不再使用时,应使用free()函数将内存块释放。

3.分配空间以后,在修改stacksize之前,top应该保持在容量顶端,S->top=S->base+S->stacksize;

2.4出栈

int pop(SqStack *q)

{

if(S->top==S->base)

return 0;

return *S->--top;;

}

说明:

1.出栈是简单操作,其实这里并没有完美的实现这个效果,你应该考虑到如果在扩容后又迅速减小,会造成大量的空间浪费。

2.5遍历栈

int printfStack(SqStack *S)

{

int *p=S->base;

puts("输出栈");

for(p;p!=S->top;p++)

{

printf("***%d",*p);

}

}


http://chatgpt.dhexx.cn/article/Y4tRW9aB.shtml

相关文章

Java数据结构-栈的应用

第1关&#xff1a;利用栈实现整数的十进制转八进制 本关任务&#xff1a;基于栈stack数据结构解决整数十进制转八进制的问题。 第2关&#xff1a;利用栈判断字符串括号是否匹配 本关任务&#xff1a;基于栈stack数据结构判断字符串中的括号是否匹配&#xff0c;字符串中仅包含…

【数据结构——栈篇】

【数据结构——栈篇】 目录 【数据结构——栈篇】一、栈的顺序存储——顺序栈1、顺序栈的表示和实现2、顺序栈的定义2、顺序栈初始化3、顺序栈入栈4、顺序栈出栈5、取顺序栈栈顶元素6、输出栈内容 二、栈的链式存储——链栈1、链栈的存储结构2、栈链的初始化3、链栈的入栈4、链…

数据结构遍历顺序栈_数据结构和算法-栈结构

栈的定义 栈是一种后进先出的数据结构。 栈是限制插入和删除只能在一个位置上的线性表。允许删除和插入的一端位于表的末端,叫做栈顶。不允许删除和插入的另一端叫做栈底。对栈的基本操作有push(压栈)和pop(出栈)。 图示: 栈的实现 栈的实现主要包括两种方式:顺序栈和链表栈…

数据结构之栈以及栈的基本操作

栈 文章目录 栈前言进栈出栈的变化形式栈的实现栈的顺序存储结构&#xff1a;栈的链式存储结构&#xff1a;文件的创建栈结构的定义栈的初始化入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空销毁栈 括号匹配问题 前言 栈是限定仅仅在表尾进行插入和删除操作的线性表。…

【数据结构二】栈

数组是一种线性结构&#xff0c;并且可以在任意位置插入和删除数据。但是有时候&#xff0c;为了实现某些功能&#xff0c;必须对这种任意性加以限制。栈和队列就是比较常见的受限的线性结构。 栈&#xff1a;Stack&#xff0c;也是一种常见的数据结构。它是一种受限的线性结构…

数据结构 栈 入栈 输出 出栈

数据结构 栈 入栈 输出 出栈 #include<bits/stdc.h> /* #include<iostream> #include<> */ using namespace std; //pA->p(Next)pB->p(top)含义是pA指向pB typedef struct Node//有节点的数据类型 {int data;//数据域struct Node * pNext; }NODE,*PN…

数据结构-栈

栈的定义 栈是一种特殊的线性表&#xff0c;仅允许在表的一端进行插入和删除运算。这一端被称为栈顶&#xff08;top&#xff09;&#xff0c;相对地&#xff0c;把另一端称为栈底&#xff08;bottom&#xff09;。向一个栈插入新元素又称作进栈、入栈或压栈&#xff08;push&…

数据结构-栈及栈的应用

目录 栈的概述 部分算法分析 顺序栈的表示和实现 global.h Stack.h StackTest.cpp 运行结果 栈的应用 数的任意进制转换 括号匹配检验 栈的概述 栈是一种重要的线性结构&#xff0c;属于一种操作受限的线性表栈(stack) 是限定仅在表尾进行插入或删除操作的线性表表尾端…

java数据结构-栈

栈 1、栈的定义 栈&#xff08;Stack&#xff09;&#xff1a;是只允许在一端进行插入或删除的线性表。首先栈是一种线性表&#xff0c;但限定这种线性表只能在某一端进行插入和删除操作。 栈顶&#xff08;Top&#xff09;&#xff1a;线性表允许进行插入删除的那一端。 栈底…

数据结构栈(顺序栈、链栈、插入push、删除pop)、队(循环队,链队、入队push,出队pop)知识点梳理

数据结构栈知识点梳理 一 栈的定义 栈&#xff08;stack&#xff09;是限定仅在表尾进行插入和删除操作的线性表 不含任何元素的栈称为空栈 允许插入和删除的一端成为栈顶&#xff08;top&#xff09;&#xff0c;另一端称为栈底&#xff08;bottom&#xff09; 具有LIFO&a…

数据结构栈和队列

整本书的知识点&#xff0c;点击右方链接&#xff1a;整本书笔记知识点 文章目录 三、栈和队列3.1、栈和队列的定义和特点3.1.1、栈的定义和特点3.1.2、队列的定义和特点 3.2、案例引入3.3、栈的表示和操作的实现3.3.1、栈的类型定义3.3.2、顺序栈的表示和实现3.3.3、链栈的表示…

C++数据结构——栈

C数据结构——栈 最近计划再复习一遍数据结构&#xff0c;看到一篇博客&#xff1a;https://www.cnblogs.com/QG-whz/p/5170418.html#_label0。 1、栈(Stack)是一种线性存储结构&#xff0c;它具有如下特点&#xff1a; &#xff08;1&#xff09;栈中的数据元素遵守“先进后…

数据结构 栈-链栈及基本操作

目录 一.栈的定义二.栈的特点三.栈的理解四.链栈引入五.链栈定义六.链栈的结构体设计七.链栈的基本操作7.1链栈的初始化7.2链栈判空7.3链栈入栈7.4链栈出栈7.4取栈顶元素 八.总结 一.栈的定义 栈是限定仅在表尾进行插入和删除操作的数据结构&#xff08;受到限制的线性表&…

数据结构之——栈

文章目录 数据结构之——栈一&#xff1a;栈的定义&#xff1a;二&#xff1a;栈的抽象数据类型&#xff1a;三&#xff1a;栈的顺序存储结构及其实现&#xff1a;1: 预说明&#xff1a;2&#xff1a;栈的顺序存储结构——结构定义&#xff1a;3:栈的顺序存储结构——进栈操作4…

数据结构与算法(3)栈

栈 1、栈的一个实际需求 请输入一个表达式&#xff1a;7x2x2-51-53-3 2、栈的介绍 栈的英文为stack 栈是一个**先入后出(FILO-First In Last Out) **的有序列表 栈(stack) 是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。 允许插入和删除的一端…

【数据结构】栈

栈的概念及结构 在学习栈前&#xff0c;我们先看一下栈的正式解释&#xff1a; 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵守后进先出 L…

什么是栈?

本文将介绍一个重要的数据结构—栈&#xff0c;和之前讲到的链表、数组一样也是一种数据呈线性排列的数据结构&#xff0c;不过在这种结构中&#xff0c;我们只能访问最新添加的数据。栈就像是一摞书&#xff0c;拿到新书时我们会把它放在书堆的最上面&#xff0c;取书时也只能…

【图解数据结构】栈全面总结

目录 一、前言 二、基本概念 三、栈的表示和实现 1.顺序栈 2.链栈 四、栈的常见算法实现 1.初始化 2.判空 3.判满 4.顺序栈取栈顶元素 5.顺序栈入栈 6.顺序栈出栈 五、双栈 1.双端顺序栈进栈操作 2.双端顺序栈出栈操作 六、栈的应用举例 1.回文游戏 2.多进制…

数据结构——栈

栈和队列 栈和队列介绍特点栈、队列与一般线性表的区别栈——stack栈的基本运算栈的存储结构顺序栈链栈 栈的应用 栈和队列 介绍 栈和队列是在软件设计中常用的两种数据结构&#xff0c;它们的逻辑结构和线性表相同 特点 栈和队列在运算上受到了限制&#xff1a;栈是按照“…

遥感影像百分比线性拉伸

AI Earth地球科学云平台开发者模式提供了丰富的遥感数据和函数计算能力&#xff0c;下面介绍结合AIE Notebook&#xff0c;实现遥感数据的百分比线性灰度拉伸。 本期开发者实践案例——遥感影像百分比线性拉伸 灰度拉伸 (GrayScale Stretch) 是遥感影像处理过程中的重要步骤&…