栈和队列(一)

news/2024/11/28 2:37:41/

文章目录

  • 顺序表,链表的有点和缺点
    • 链表
    • 顺序表
  • 栈和队列
    • 栈的实现
    • 栈的应用(括号匹配问题)

顺序表,链表的有点和缺点

链表

优点
1、任意位置插入删除,时间复杂度位O(1)
2、按需申请释放空间
缺点
1、不支持下标的随机访问
2、CPU的高速缓存命中率更低

顺序表

优点:
1、支持下标的随机访问
2、尾插尾删的时间复杂度位O(1)
3、CPU高速缓存的命中率更高
缺点
1、前面部分插入删除数据,时间复杂度位O(N),需要挪动数据
2、空间不够,需要扩容
a、扩容是需要付出代价的
b、一般还会伴随空间浪费

这里的命中率涉及到了计算机组成原理的存储器的内容。大家可以去看看。

栈和队列

栈的概念:栈是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶,相应地,表头端称为栈底。不含元素的空表称为空栈。
后进先出,先进后出
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

栈的实现

#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
#include <assert.h>
//定义栈的类型
typedef int STDataType;typedef struct stack
{STDataType* a;int top;int capacity;
}ST;//函数接口的声明
void STInit(ST* pst);
void STDestory(ST* pst);
void STPush(ST* pst, STDataType x);
void STPop(ST* pst);
bool STEmpty(ST* pst);
int STSize(ST* pst);
STDataType STTop(ST* pst);

在对栈初始化时我们需要考虑top的值初始化为多少,如果初始化为-1指向的就是栈顶的元素,初始化为0指向的就是栈顶元素的下一个位置。
栈的接口实现:

#include "Stack.h"
void STInit(ST* pst)
{assert(pst);pst->a = NULL;pst->capacity = pst->top = 0;
}
void STDestory(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->capacity = pst->top = 0;
}
void STPush(ST* pst, STDataType x)
{assert(pst);//考虑扩容if (pst->capacity == pst->top){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;//当a为空指针时,realloc的作用和malloc的作用一样STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);if (tmp==NULL){perror("realloc failed");return;}pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top++] = x;
}
void STPop(ST* pst)
{assert(pst);assert(!STEmpty(pst));pst->top--;
}
bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}
int STSize(ST* pst)
{assert(pst);return pst->top;
}
STDataType STTop(ST* pst)
{assert(pst);assert(!STEmpty(pst));return pst->a[(pst->top) - 1];
}

队列的概念:和栈相反,队列是一种先进先出的的线性表。它只允许在表的一端进行插入,而在另一端删除元素。这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开。在队列中允许插入的一端叫做队尾,允许删除的一端则称为队头
在这里插入图片描述

栈的应用(括号匹配问题)

解题思路,我们可以使左括号进栈,遇到右括号时出左括号,如果不匹配返回false,如果括号序列结束了,栈中还有括号,那么说明括号不匹配,返回false,如果只有右括号,此时栈中为空,不能出栈,说明括号不匹配,直接返回false。
leetcode做题链接
具体代码如下:

bool isValid(char * s){//首先初始化一个栈ST st;//初始化栈STInit(&st);while(*s){//遇到左括号进栈if(*s=='('||*s=='{'||*s=='['){STPush(&st,*s);}else   //遇到右括号,退栈{//如果此时的栈为空,即没有左括号,括号不匹配,返回falseif(STEmpty(&st)){STDestory(&st);return false;}char top = STTop(&st);STPop(&st);if((top=='('&&*s!=')')||(top=='{'&&*s!='}')||(top=='['&&*s!=']')){STDestory(&st);return false;}} s++;}//销毁栈bool ret = STEmpty(&st);STDestory(&st);if(ret){STDestory(&st);return true;}return false;
}

队列的实现见下一篇。


http://www.ppmy.cn/news/516624.html

相关文章

TypeScript的类型推导

TypeScript (简称ts) 是一种静态类型的编程语言&#xff0c;在类型检查和类型推导方面具有一定的优势。类型推导是TypeScript在代码编写的过程中自动识别并设置变量类型&#xff0c;从而提高代码的可读性和健壮性&#xff0c;减少了代码中潜在的错误。 在 TypeScript 中&#…

【Python】文件操作 ⑤ ( 文件操作 | 以只读模式向已有文件写入数据 | 以追加模式向已有文件写入数据 | 以追加模式打开一个不存在的文件 )

文章目录 一、向文件写出数据1、以只读模式向已有文件写入数据2、以追加模式向已有文件写入数据3、以追加模式打开一个不存在的文件 一、向文件写出数据 1、以只读模式向已有文件写入数据 使用 write 函数向已有文件写入数据 , 会清空该文件中的数据 , 代码展示如下 : file1.t…

html5禁用右侧滚轮条,鼠标滚轮终于不乱跳了,自己动手更换鼠标滚轮编码器 雷柏7100=================...

这个鼠标已经服役3年多了&#xff0c;鼠标两侧的漆都被“汗化”了 前不久就给鼠标贴了碳纤维贴纸&#xff0c;鼠标一下子又焕发了青春 看下图。(由于碳纤维贴纸是以前贴的所以没有贴的过程) 好了这次的重点不是外观而是滚轮&#xff0c;最近浏览网页上下滚滚轮时老是上下乱跳。…

支持轴体热插拔的平价机械键盘,全尺寸带灯效,雷柏V700DIY上手

日常工作娱乐中少不了键盘&#xff0c;这两年定制化的机械键盘很受欢迎&#xff0c;不过动辄上千的发烧键盘还是让很多朋友望而却步&#xff0c;好在目前市面上也有不少平价款的DIY键盘可以选择&#xff0c;像是我现在用的这款雷柏 V700DIY&#xff0c;就可以轻松定制&#xff…

PHP格式、数据类型、常量及字符串

PHP脚本以<?php 开始&#xff0c;以 ?>结束。 <?php //php脚本的基本格式&#xff0c;单行注释 /* *多行注释&#xff0c;跟java的注释方法相同 **/ //php的变量声明是以$开始,后面跟着变量的名称 变量名必须以字母或者下划线字符开始 变量名只能包含字母、数…

802.1Q帧格式

802.1Q帧格式 802.1QTag的长度是4bytes&#xff0c;它位于以太网帧中源MAC地址和长度/类型之间。802.1QTag包含4个字段。 Type&#xff1a;长度为2bytes&#xff0c;表示帧类型&#xff0c;802.1Qtag帧中type字段取固定值0x8100&#xff0c;如果不支持802.1Q的设备收到802.1Q…

q-flashplus怎么使用_技嘉主板使用Q-FLASH刷BIOS详解

技嘉的Q-Flash是一个隐藏在BIOS Flash ROM里用于BIOS升级的工具。Q-Flash工具的特色在于&#xff0c;您只要在开机后按”End“键或者进入BIOS界面后按”F8“键就能进入Q-Flash工具进行BIOS的升级、备份&#xff0c;而不需进入DOS模式或者Windows。目前新版本的Q-Flash支持通过U…

W25Q64 Flash芯片原理与应用方案(含W25Q64中文数据手册)

W25Q64是华邦公司推出的大容量SPI FLASH产品&#xff0c;其容量为64Mb&#xff08;8MB&#xff09;&#xff0c;应用较为广泛。 W25Q系列的器件在灵活性和性能方面远远超过普通的串行闪存器件。W25Q64将8M字节的容量分为128个块&#xff0c;每个块大小为64K字节&#xff0c;每个…