DS之栈

对于栈的理解,早就在上C++课的时候,程老师就给我们做过简单的介绍和使用,今年接触了数据结构这本书,有了一个全面的学习,不得不说是一本很难啃的一本书,但是为了写出更好的程序代码,这门课是在所难免的。

在数据结构中,栈是一类重要的抽象数据类型。从数据结构角度看,栈也是一种线性结构,属于线性表,其特殊性在于栈的基本操作是线性表操作的子集,它是操作受限的线性表。从数据类型角度看,它和线性表是大不相同的抽象的多型数据类型。

栈的定义

栈(stack)是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应地,表头端称为栈底(bottom)。不含元素的空表称为空栈。假设栈S=(a1,a2,a3,...,an),则称a1为栈底元素,an为栈顶元素。栈中元素按a1,a2,...,an的次序进栈,退栈的第一个元素应为栈顶元素。换句话说,栈的修改是按后进先出的原则进行的。因此,栈又称为后进先出的线性表。下面的图很好的解释了这个原则。

栈的表示和实现

和线性表类似,栈也有两种存储表示方法。

顺序栈

先来说一下顺序栈:即栈的顺序存储结构是利用一组地址连续的存储单元依次存放在自栈底到栈顶的数据元素,同时附设指针top表示栈顶元素在顺序栈中的位置。top为栈顶指针,其初始值指向栈底,每当插入新的栈顶元素时,指针top增1.删除栈顶元素时,指针top减1,因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置上。下面的图很好的说明了顺序栈中数据元素和栈顶指针之间的对应关系。

链栈

顺序栈在运算过程中可能发生“溢出”现象(上溢和下溢),即存在栈满以后就不能再进栈的问题,这时候就用到了栈的链式存储结构,也就是所谓的链栈。其各结点的结构与单链表中的结点结构完全相同。结点包括两个域:其中的存储数据元素的信息的域称为数据域,存储直接后继存储位置的域称为指针域。指针域中存储的信息叫做指针或链。在这里学过链表的知识就会知道链栈是怎样实现基本操作的,下面的图很好的解释了这个问题。

一顺序栈的定义

通常的习惯做法是以top=0表示空栈。由于栈在使用过程中所需最大空间的大小难以估计,在初始化设空栈时不应限定栈的最大容量。一个较合理的做法就是:先为栈分配一个基本容量,然后再应用的过程中,当栈的空间不够使用时再逐段扩大。为此,可以设定两个常量:STACK_INIT_SIZE(存储空间初始分配量)和STACKINCREMENT(存储空间分配增量)。

<span style="font-size:18px;">#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
typedef int SElemType;//重新定义SElemType为int型
typedef struct{//重新定义SqStck为结构类型
	SElemType *base;//栈底指针
	SElemType *top;//栈顶指针
	int stacksize;//栈的当前可使用的最大容量
}SqStack</span>

二链栈的定义

链栈最重要的就是结点类型的定义和实现

<span style="font-size:18px;">typedef int ElemType;//重新定义ElemType为int型
typedef struct node//重新定义node为结构类型
{
	ElemType date;//定义的结点的数据域
	struct node *next;//定义的结点的指针域
}node,*pointer;//定义的指向node结构类型指针变量pointer
</span>
时间: 2024-11-07 15:06:23

DS之栈的相关文章

DS之栈实现数制转换(补充)

在计算机进制转换的时候,最常用的就是二进制,八进制,十进制,和十六进制,以及它们之间的转换.而在现实生活中最常用的十进制数是我们一贯的作风.在计算机系统最常用的是二进制,十六进制,八进制. 在上一次使用顺序栈实现进制转换的时候,一直在考虑十六进制的问题,最终也没有实现,就收手了.过了一天,再次尝试着看代码,也问了好多的同学,都不会,他们所做的只是进行十进制以下的进制转换,我考虑的十六进制没有人解释.白天一直在想是哪里出错了,输出的结果为什么会多出多余的数字,知道问题出在进制转换函数,而且在出栈的

第1部分 DOS及DEBUG介绍

转自:https://www.shiyanlou.com/courses/running/332 一.课程简介 - 声明:该课程基于<汇编语言(第2版)>郑晓薇 编著,机械工业出版社.本节实验取自教材中第二章的<实例二 进入计算机>. - 实验环境: 1.DOS 环境 实验环境中安装有dosemu可以模拟DOS环境,并提供DEBUG.MASM.LINK等汇编语言开发程序. 2.进入DOS和DEBUG在桌面上双击dosemu图标,直接进入DOS.再做如下操作: C:\〉D: ——回车

你会查杀病毒吗?反病毒技巧! 比较长。

现在拥有电脑的朋友们,很多没有经历过DOS时代(绝非以老卖老),仅仅是在图形桌面和鼠标点击下成长的,所以对于引导区.病毒的传染.复制方面不是很了解,有的甚至跟本就不了解.甚至是谈"毒"色变,把机器一切不正常现象都归于-"是有病毒了吧?"非也,告诉大家病毒很简单,人做的程序而已,别怕.其实病毒机理无非就是"感染->优先运行->自我复制->隐藏.破坏->传播"几个步骤.熟悉了这些,我们就可以知道,杀毒到底要从什么方面入手.先就

中断与异常详解(二)

中断或异常发生之前 当 CPU 执行了当前指令之后,CS 和 EIP 这对寄存器中所包含的内容就是下一条将要执行 指令的逻辑地址.在对下一条指令执行前,CPU 先要判断在执行当前指令的过程中是否发生 了中断或异常. 如果发生了一个中断或异常 那么 CPU 将做以下事情 • 确定所发生中断或异常的向量i(在 0-255 之间). • 通过 IDTR 寄存器找到 IDT 表,读取 IDT 表第i项(或叫第i个门). • 分两步进行有效性检查:首先是“段”级检查,将 CPU 的当前特权级 CPL(存放

比较分别在数据段与附加段中的字符串以及汇编中常见的四种中断指令

1.从键盘输入两个相同长度的字符串,分别放到数据段和附加段,利用串比较指令比较数据段和附加段中两个字符串,如果两串一样,输出Y,否则输出N. 这个程序调试了好久,之间遇到两个问题,其一是附加段的使用,需要对DS压栈对ES调整处理,即 1 PUSH DS 2 MOV AX,ES 3 MOV DS,AX 4 ;...... 5 POP DS 其二是,串比较指令CMPSW进行字比较,而CMPSB进行字节比较,需要区分开.(其实我现在还不明白即便是字符组成的串,进行字比较为什么会出错,有高手知道吗?)

JAVA字节码解析

Java字节码指令 Java 字节码指令及javap 使用说明 ### java字节码指令列表 字节码 助记符 指令含义 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 iconst_0 将int型0推送至栈顶 0x04 iconst_1 将int型1推送至栈顶 0x05 iconst_2 将int型2推送至栈顶 0x06 iconst_3 将int型3推送至栈顶 0x07 iconst_4

Java数据结构--链表

不懂的先看一下这个百度文库资料http://wenku.baidu.com/link?url=sBTDm0r0or_eLyZPHnsGs5mlnKYKtzuX9FveJ-nguoQcFPM-ZjWauNFP0P2cvh7Qx-UZToPFHMzoGT0mB92rza5LkHT78FMzPIUaKqWKnNC 看懂资料在看一下下面的东西 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的).对于每个节点来说,除了存储其本身的信息(数据值

至终擅妆靡泳甭撼墓衔坊铱ggwb

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

汇编整理

数据寄存器 Ax,cx,dx,bxA 1字节(3BH)=8位 Ax=ABCDH AX分为高八位(AH),低八位(AL) nop空指令 EIP指向cpu所取得指令 Mov ax,19 Mov ah,70 Add ax,bx, Add al,1 Sub ax,1 物理地址 存储器里唯一的字节地址, 8086 16位cpu,20位地址总线 物理地址=段地址*10h+偏移 Cs(内存分的段):1000H,IP:0022 物理地址:1000H*10H+0022H ds和[address] Mov ax,[