【栈】栈的定义及基本操作

1. 栈的定义和特点

定义:栈是限定尽在表尾进行插入或删除操作的线性表。

表头元素成为栈底,表尾元素成为栈顶。 

特点:后进先出(先进后出)

2. 顺序栈       

顺序栈是利用顺序存储结构实现的栈,即用一组连续的存储单元依次存储自栈底到栈顶的数据元素。

top 指针指向栈顶元素的指针,base 指针指向栈底元素的指针;

Q.栈不是仅限于栈顶(表尾)进行插入和删除的线性表吗?为何还需要栈底指针?

习惯用 top == 0 表示空栈,鉴于 C/C++语言中数组的下标约定从 0 开始,因此用 C++语言描述是会带来困惑,因此另设指针base 指向栈底元素在顺序表中的位置。

注意点

(1)栈底指针 base,初始化完成之后,始终指向栈底的位置。

         若base == NULL ,则表明栈结构不存在。

(2)栈顶指针 top,其初值为指向栈底。

        栈为空时 top == base,非空时 top 始终指向栈顶元素的上一个位置。

2.1 顺序栈的存储结构

#define MAXSIZE 100
typedef struct{SElemType *base;  //利用base 指针指向基地值,即为栈底SElemType *top;int stackszie; 
}SqStack;

2.2 顺序栈的基本操作

1. 顺序栈的初始化

void InitStack(SqStack &S){S.base = new SElemType[MAXSIZE];if(!S.base) exit(OVERFLOW);S.top = S.base;  //栈顶指针指向base,表示栈空S.stacksize = MAXSIZE; 
}

2. 顺序栈的插入

void Push(SqStack &S,SElemType e){if(S.top - S.base == S.stacksize){cout << "栈已满,无法进行插入操作!" << endl; return;}*S.top++ = e;cout << "成功插入元素!" << endl; 
}

3. 顺序栈的删除

void Pop(SqStack &S,SElemType &e){if(S.top == S.base) {cout << "栈空,无法进行删除操作!" << endl;return;}e = *--S.top;  //由于栈顶指针始终指向栈顶元素的上一个位置 cout << "成功删除元素!" << endl; 
}

4. 顺序栈的取值

SElemType GetTop(SqStack S){if(S.base != S.top)return *(S.top - 1); 
} 

3. 链栈                                                                                          

链栈是指采用链式存储结构实现的栈。

由于栈的主要操作是在栈顶插入和删除,因此以链表的头部作为栈顶,并且没有必要附加一个头结点。

3.1 链栈的存储结构

typedef struct StackNode{SElemType data;struct StackNode * next;
}StackNode,*LinkStack;

3.2 链栈的基本操作

1. 链栈的初始化

void InitLinkStack(LinkStack &S){S = NULL;    //直接让头指针指向首元结点即可 cout << "成功创建链栈!" << endl;
} 

2. 链栈的插入

void Push(LinkStack &S,SElemType e){StackNode *p = new StackNode;p -> data = e;p -> next = S;S = p;cout << "插入成功!" << endl;
} 

3. 链栈的删除

void Pop(LinkStack &S,SElemType &e){if(S == NULL) {cout << "栈空,无法进行删除操作" << endl;return; }StackNode *p = new StackNode;p = S;S = S -> next;e = p -> data;delete p; 
}

4. 链栈的取值

SElemType GetTop(LinkStack &S){if(S != NULL){return S -> data;}
}

                                                                                                                           

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/64170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UNIX简史

从1991年Linux出现至今&#xff0c;由于众多IT巨头以及技术社区的推动&#xff0c;Linux已经成为非常成熟、可用于各种关键领域的操作系统&#xff0c;适当了解其发展历史&#xff0c;对于理顺其技术流派、从而更好地学习和使用Linux具有重要意义。由于其基于UNIX系统二十多年的…

C# OpenCV机器视觉:畸变矫正

在一个阳光明媚的早晨&#xff0c;阿强决定去拍照。他拿起相机&#xff0c;穿上他最喜欢的羊毛大衣&#xff0c;准备记录下生活中的美好瞬间。可是&#xff0c;当他兴奋地查看照片时&#xff0c;发现自己拍的每一张都像是被外星人用变形金刚的力量扭曲过一样&#xff01;“这是…

读书|关于马斯克

于我而言&#xff0c;马斯克是一个有魅力的人&#xff0c;他张扬嚣张、却又一直做着惊世骇俗的事情。 关于健康 马斯克本身的工作就十分忙碌&#xff0c;但早年的他生活习惯也极其不规律&#xff0c;睡眠不足、饮食糊弄、懒得运动。健康三要素一个不占。另外&#xff0c; 42 …

tryhackme——Defensive Security Intro(防御安全简介)

任务一&#xff1a;Introduction to Defensive Security防御安全简介 此room的两个要点&#xff1a; Preventing intrusions from occurring 防止入侵发生Detecting intrusions when they occur and responding properly 检测发生的入侵并正确响应 防御安全还有更多内容。 除上…

使用rust语言创建python模块(pyo3+maturin)

1. 首先使用conda创建python虚拟环境&#xff08;已创建的可省略&#xff09; >conda create --prefixE:\python_envs\rust_python python3.11 2. 激活python虚拟环境 conda activate rust_python 3. 安装maturin pip install maturin 4. 创建rust项目 >cd E:\py…

阿里云RAM实战详解

引言 阿里云RAM(Resource Access Management)是一款用于管理阿里云资源访问权限的服务。通过RAM,您可以为不同的用户分配不同的访问权限,确保资源的安全和可控。本文将详细介绍RAM的实战应用,结合最佳实践,帮助您更好地管理阿里云资源。 RAM的核心概念 在使用RAM之前,…

解锁CSS新维度:预处理器之LessSass

在现代前端开发中&#xff0c;CSS&#xff08;层叠样式表&#xff09;是用于控制网页外观的主要技术。然而&#xff0c;随着项目的复杂度增加&#xff0c;传统的CSS编写方式逐渐显现出其局限性&#xff0c;如变量复用、嵌套规则、模块化管理等需求难以满足。为此&#xff0c;出…

C++中函数的特性

文章目录 一、C中形参带默认值的函数二、C中的inline内联函数三、C中的inline内联函数和普通函数的区别四、C中函数重载五、C为什么支持函数重载六、C语言为什么无法实现函数重载 一、C中形参带默认值的函数 在C中&#xff0c;形参带默认值的函数是指在函数声明或定义时&#…

关于Postgresql旧版本安装

抛出问题 局点项目现场&#xff0c;要求对如下三类资产做安全加固&#xff0c;需要在公司侧搭建测试验证环境&#xff0c;故有此篇。 bclinux 8.2 tomcat-8.5.59 postgrel -11 随着PG迭代&#xff0c;老旧版本仅提供有限维护。如果想安装老版本可能就要费劲儿一些。现在&…

使用echarts实现3d柱状图+折线图

以下代码有问题请直接问国内直连GPT/Claude HTML 需要注意threeDchart一定要设置宽度高度&#xff0c;不然图不显示,然后echarts版本不要太低&#xff0c;不然也不显示 <div id"threeDchart" class"threeDchart"></div>js set3DBarChart2(dat…

2024.1212-02-虚拟私人网(VPN) 虚拟局域网 及隧道技术(四)--GRE47 Etherip97 原理及应用

虚拟局域网 及隧道技术&#xff08;四&#xff09;-GRE47 & Etherip97原理及应用 概述原理及应用EOIP/Etherip概念区别 隧道协议标准EtherIP &#xff08;IP protocol number 97&#xff09;GRE 开源工具katlogic-eoip 验证环境GRE&#xff08;EOIP&#xff09;演示验证Eth…

一个初始化bitmap的小算法

一个初始化bitmap小算法 根据长度&#xff0c;创建bitmap初始化bitmap 根据长度&#xff0c;创建bitmap 看到一个开源项目&#xff0c;利用bitmap存储数据&#xff0c;其中创建和初始化过程&#xff0c;比较经典。这里摘录出来&#xff0c;以备后续使用。代码采用的是golang …

【从零开始入门unity游戏开发之——C#篇01】理论开篇,理解什么是编程

文章目录 前言前置条件进制什么是十进制、二进制二进制有什么用&#xff1f;为什么计算机用二进制而不用十进制&#xff1f;二进制转十进制十进制转二进制二进制运算 计算机中的数据存储单位什么是编程&#xff1f;什么是代码&#xff1f;什么是编程语言&#xff1f;常见的编程…

黑盒白盒测试

任务1 黑盒测试之等价类划分法 【任务需求】 【问题】例&#xff1a;某报表处理系统要求用户输入处理报表的日期&#xff0c;日期限制在2003年1月至2008年12月&#xff0c;即系统只能对该段期间内的报表进行处理&#xff0c;如日期不在此范围内&#xff0c;则显示输入错误信息…

CSS学习记录11

CSS布局 - display属性 display属性是用于控制布局的最终要的CSS属性。display 属性规定是否/如何显示元素。每个HTML元素都有一个默认的display值&#xff0c;具体取决于它的元素类型。大多数元素的默认display值为block 或 inline。 块级元素&#xff08;block element&…

ByteCTF2024

wp参考&#xff1a; 2024 ByteCTF wp 2024 ByteCTF WP- Nepnep ByteCTF 2024 writeup by Arr3stY0u 五冠王&#xff01;ByteCTF 2024 初赛WriteUp By W&M ByteCTF 2024 By W&M - W&M Team ByteCTF Re WP - 吾爱破解 - 52pojie.cn 2024 ByteCTF - BediveRe_R…

C#,在 C# 语言中将 LaTeX 转换为 PNG 或 JPG 图像

在 C 语言中将 LaTeX 转换为 PNG 或 JPG 图像# 12月 28&#xff0c; 2021 2 分钟 法尔汉拉扎 在 C 语言中将 TeX 转换为 PNG JPG 图像# TeX 格式用于处理技术和科学文件。它通常用于交流或发布此类文档。在某些情况下&#xff0c;您可能需要将 TeX 文件渲染为 PNG 或 JPG 等图像…

AI监控赋能健身馆与游泳馆全方位守护,提升安全效率

一、AI视频监控技术的崛起 随着人工智能技术的不断发展&#xff0c;AI视频监控正成为各行业保障安全、提升效率的关键工具。相比传统监控系统&#xff0c;AI技术赋予监控系统实时分析、智能识别和精准预警的能力&#xff0c;让“被动监视”转变为“主动防控”。 二、AI监控应用…

搭建Tomcat(一)---SocketServerSocket

目录 引入1 引入2--socket 流程 Socket&#xff08;应用程序之间的通讯保障&#xff09; 网卡(计算机之间的通讯保障) 端口 端口号 实例 client端 解析 server端 解析 相关方法 问题1&#xff1a;ServerSocket和Socket有什么关系&#xff1f; ServerSocket Soc…

爬虫学习案例5

爬取b站一个视频 罗翔老师某一个视频很刑 单个完整代码&#xff1a; 安装依赖库 pip install lxml requests import osimport requests import re from lxml import etree import json # 格式化展开输出 from pprint import pprint # 导入进程模块 import subprocess head…