【数据结构第二周】堆栈知识点整理

堆栈(Stack):具有一定操作约束的线性表

只在一端(栈顶,Top)做插入和删除

1、栈的顺序存储实现

栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成。

(1)存储

#define MaxSize <储存数据元素的最大个数>
typedef struct
{
	ElementType Data[MaxSize]
	int Top;
}Stack;

(2)入栈

void Push(Stack *PtrS, ElementType item)
{
	if (PtrS->Top == MaxSize-1)
	{
		printf("堆栈满");
		return;
	}else
	{
		PtrS->Data[++(PtrS->Top)] = item;
		return;
	}
}

(3)出栈

ElementType Pop(Stack *PtrS)
{
	if (PtrS->Top == -1)
	{
		printf("堆栈空");
		return ERROR;
	}else
	{
		return (PtrS->Data[(PtrS->Top)--]);
	}
}

2、堆栈的链式存储实现

栈的链式存储结构实际上就是一个单链表,叫做链栈。

插入和删除操作只能在栈链的栈顶进行

栈顶指针Top应该指向链表的头结点

(1)初始化

typedef struct Node
{
	ElementType Data;
    struct Node *Next;
} LinkStack;
LinkStack *Top;
LinkStack *CreateStack()
{ /* 构建一个堆栈的头结点,返回指针 */
   LinkStack *S;
   S = malloc( sizeof(struct Node ));
   S->Next = NULL;
   return S;
}
int IsEmpty( LinkStack *S )
{ /*判断堆栈S是否为空,若为空函数返回整数 1,否则返回0 */
   return ( S->Next == NULL );
}

(2)入栈

void Push( ElementType item, LinkStack *S )
{ /* 将元素item压入堆栈S */
    struct Node *TmpCell;
    TmpCell = malloc( sizeof( struct Node ) );
    TmpCell->Element = item;
    TmpCell->Next = S->Next;
    S->Next = TmpCell;
}

(3)出栈

ElementType Pop( LinkStack *S )
{ /* 删除并返回堆栈S的栈顶元素 */
   struct Node *FirstCell;
   ElementType TopElem;
   if( IsEmpty( S ) )
   {
        printf(“堆栈空”);
        return NULL;
   }else
   {
        FirstCell = S->Next;
        S->Next = FirstCell->Next;
        TopElem = FirstCell ->Element;
        free(FirstCell);
        return TopElem;
    }
} 
时间: 2024-10-13 01:24:51

【数据结构第二周】堆栈知识点整理的相关文章

【数据结构第二周】队列知识点整理

队列(Queue):具有一定操作约束的线性表 插入和删除操作:只能在一端插入,而在另一端删除 先进先出 1.队列的顺序存储实现 队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front以及 一个记录队列尾元素位置的变量rear组成 (1)初始化 #define MaxSize <储存数据元素的最大个数> typedef struct { ElementType Data[ MaxSize ]; int rear; int front; } Queue; (2)入队列 voi

【数据结构第二周】线性表知识点整理

1.什么是线性表? 线性表(Linear List):由同类型元素构成有序序列的线性结构. 表中元素个数称为线性表的长度 线性表没有元素时,称为空表 表起始位置称表头,表结束位置称为表尾 2.线性表的抽象数据类型描述 List MakeEmpty():初始化一个空线性表L;ElementType FindKth( int K, List L ):根据位序K,返回相应元素 ; int Find( ElementType X, List L ):在线性表L中查找X的第一次出现位置; void Ins

整理第二周C知识点2流程之循环

流程控制(重点) 循环分类:1.for 2.while 3.do...while for: for(单次表达式1;条件表达式2;末尾表达式3) 语句A;//执行顺序:1-->2-->A-->3(一个循环结束)-->2(是否成立,成立继续执行A,不成立则for循环结束)-->A 执行的流程[重点]: 单个for循环的使用(上例) 多个for循环的嵌套使用 e.g: 1.for(1;2;3)//第一层循环 for(4;5;6)//第二层循环 A; B;//整理2个语句:第1个语句

计算机基础第二周作业 作业整理函数知识点:(大部分笔记都在电脑的印象笔记里面) 这次总结的粗了一点

一. 字符编码 核心:以什么编码写的存入硬盘,就以什么编码取出 1.1  内存使用的是unicode编码,全是两个字节提高传输速度..一般都是使用utf-8的万国编码,优点是节省空间.缺点是运行速度相对较慢 1.2  数据最先产生在内存中的 是unicode格式,想要传输就要转化成二进制的bytes格式 1 #unicode----->encode(utf-8)------>bytes 2 拿到bytes,就可以往文件内存放或者基于网络传输 3 #bytes------>decode(g

整理第二周C知识点1流程之选择

流程控制(重点) 1.流程控制:程序执行的数序 分类:1.顺序 2.选择 3.循环 2.选择:某些代码可能执行 也可能不执行,有选择的执行一些代码 (1)if用法: if(表达式) 语句A;//如果表达式为真,执行语句A:若表达式为假,则不执行语句A (2)一.if的作用范围: if(表达式) 语句A; 语句B;//if默认只能控制A的执行或不执行 if无法控制B的执行或不执行.或者B一定执行 二.if(表达式) { 语句A; 语句B; }//此时if可以控制A和B:if只能控制一个语句的执行或

老男孩Linux运维第41期20170903开班第二周学习重点记录

第二周讲课知识点总结 主要内容1:连接虚拟机故障排错 使用ping命令查看是否能连接到目标机器的IP地址. 查看中间有没有硬件/软件防火墙(包括系统防火墙.杀软防火墙.selinux等) 查看服务是否已开启,有没有启用vmware所有相关服务(services.msc下有五个vmware开头的服务均需开启),使用telnet命令测试某一个端口是否开启. 保证虚拟机的网络连接-vmnet8 已启动. 主要内容2:第一关练习题 [考试试题] 特别说明:如果前 11道不能都答对就是纯菜鸟级别了,如果答

20172328《程序设计与数据结构》第二周学习总结

20172328李馨雨<程序设计与数据结构>第二周学习总结 又到周五,李馨雨同学要开始写博客了.让我们开始吧!(????) 教材学习内容总结 1.首先是String类定义的字符串,然后是print和println的区别.转义字符的学习.(让我印象深刻的\b[回车符]在字符串结尾不显示哈哈,及其更新的\t[换行符],还有在课堂上真正明白了什么是回车.) 2.了解变量.常量.赋值语句.变量:保存数据的内存单元.常量:坚定自己不会变的数据!除非你用java的反射(有点复杂,改权限.去修饰符等等.没实

《javascript高级程序设计》第二、三章知识点整理

第二章知识点总结 1.<script>在html中的使用 主要功能:在页面中嵌入javascript代码或包含外部javascript文件. 常用属性: type:用于定义脚步代码的语言类型,默认为text/javascript. src:包含外部域的javascript文件. defer:表示脚本会在整个页面加载完毕之后运行,只对外部文件有效,最好只包含一个延迟脚本. async:脚本在不妨碍其他操作的情况下立即下载(不保证下载文件的顺序). 插入位置:在页面<body>标签页面

20172322 2017-2018-2 《程序设计与数据结构》第二周学习总结

20172322 2017-2018-2 <程序设计与数据结构>第二周学习总结 教材学习内容总结 了解了print与println的区别 了解了字符串的拼接可以用+来完成 了解了转义字符的使用 学会了使用赋值 学会使用部分算术运算符 学会了使用Scanner来实现交互性 教材学习中的问题和解决过程 问题1:在最初接触赋值时对foalt和double的赋值范围不了解 问题1解决方案:使用万能的度娘后看到一个高赞答案后有了了解 问题2:在提前预习时看到2.7图形后敲入的代码无法执行 问题2解决方案