数据结构----结构--线性结构--栈,队列

数据结构----结构–线性结构–栈,队列

一.栈:Stack

1.栈的特点:

​ 先进后出:FILO(对一组数据有倒叙要求时可以用栈)

2.栈的实现

顺序存储:数组实现:

​ 缺点:空间大小受限

链式存储:链表实现

3.栈的基本函数(这里是一部分)

1.Init

2.Push

3.Pop

4.Clear

5.Destory

6.Count

7.IsEmpty

创建栈,并实现Push,Pop这两个函数

代码如下

//c语言
#include <stdio.h>
#include <stdlib.h>
typedef struct Node { int m_value;struct Node* m_pNext;}PNode;PNode* creatStack() {//创建栈PNode* stackTop = NULL;//栈顶return stackTop;
}
void  creatStackNode(int x, PNode** stackTop) {//创建栈中的元素PNode* Temp = (PNode*)malloc(sizeof(PNode));Temp->m_value = x;Temp->m_pNext = NULL;//添加元素Temp->m_pNext = *stackTop;*stackTop = Temp;
}void stackpush(int x, PNode** stackTop) {//往栈里添加元素creatStackNode(x, stackTop);//创建元素,并添加元素
}void stackpop(PNode** stackTop) {//出栈if (stackTop == NULL) return;PNode* Temp = *stackTop;printf("%d\n", Temp->m_value);//输出该元素的值*stackTop = (*stackTop)->m_pNext;free(Temp);//释放空间
}int main() {PNode* stackTop = creatStack();//获得一个栈,此时是空栈stackpush(3, &stackTop);//添加元素stackpush(6, &stackTop);stackpush(7, &stackTop);stackpop(&stackTop);//弹出元素stackpop(&stackTop);stackpop(&stackTop);return 0;
}

进行所有函数的实现(对上面代码进行一些改动)

代码如下

//c语言
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {int m_value;struct Node* m_pNext;}PNode;typedef struct Top {PNode* p_Top;int count;
}PTop;PTop* Init() {//创建PTop* p1 = (PTop*)malloc(sizeof(Top));p1->p_Top = NULL;p1->count = 0;return p1;
}
void  creatStackNode(int x, PTop* P_Top) {//创建栈中的元素if (P_Top == NULL) {printf("栈不存在\n");exit(1);}PNode* Temp = (PNode*)malloc(sizeof(PNode));Temp->m_value = x;Temp->m_pNext = NULL;//添加元素printf("入栈元素的值为%d\n", Temp->m_value);Temp->m_pNext = P_Top->p_Top;P_Top->p_Top = Temp;P_Top->count += 1;
}void stackpush(int x, PTop* P_Top) {//往栈里添加元素creatStackNode(x, P_Top);//创建元素,并添加元素
}void stackpop(PTop* P_Top) {//出栈if (P_Top->p_Top == NULL) return;PNode* Temp = P_Top->p_Top;printf("出栈元素的值为%d\n", Temp->m_value);//输出该元素的值P_Top->p_Top = (P_Top->p_Top)->m_pNext;P_Top->count -= 1;free(Temp);//释放空间
}void clear(PTop* P_Top) {//清空栈if (P_Top->count == 0) {printf("无链表\n");}while (P_Top->p_Top != NULL) {stackpop(P_Top);}printf("链表已被清空\n");
}void Count(PTop* P_Top) {//看栈中的元素有几个printf("栈中的元素有%d个\n",P_Top->count);
}int IsEmpty(PTop* P_Top) {//判断是否为空if (P_Top->count) {printf("不为空 返回\n");return 1;}else {printf("为空 返回\n");return 0;}
}
void GetTop(PTop* P_Top) {printf("栈顶元素为");printf("%d\n",(*P_Top->p_Top).m_value);
}void Destory(PTop** P_Top) {if (P_Top == NULL) {printf("无栈");}clear(*P_Top);printf("栈顶已被回收\n");delete *P_Top;*P_Top = NULL;
}
int main() {PTop* P_Top = Init();//获得栈顶stackpush(3, P_Top);//添加元素stackpush(6, P_Top);GetTop(P_Top);Count(P_Top);stackpush(7, P_Top);Destory(&P_Top);//stackpop(&P_Top);//弹出元素//stackpop(&P_Top);//stackpop(&P_Top);stackpush(3, P_Top);return 0;
}

4.可用栈的题目

第一题

题目:一万个括号 ‘(’ ‘)’,判断这些括号是否完全匹配
解决
方法一:

​ 1.循环,如果是左括号就入栈

​ 2.如果是右括号将栈顶的元素出栈,如果栈中无元素,就是不匹配,右括号无对应的左括号

​ 3.当括号都处理完了,那么循环结束,可以判断完全匹配

方法二:

​ 循环,左半括号记为加1,右半括号记为-1,当总和小于0时就是不匹配

​ 当括号都处理完了,那么循环结束,可以判断完全匹配

第二题(网址为https://leetcode.cn/problems/valid-parentheses/)

题目:给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。
解决

​ 1.循环,如果是左括号就入栈

​ 2.如果是右括号将栈顶的元素出栈,并根据出栈的括号类型进行判断,如果栈中无元素,就是不匹配,右括号无对应的左括号

​ 3.当括号都处理完了,那么循环结束,可以判断完全匹配

代码如下
//这里的代码是c++语言下的
class Solution {
public:bool isValid(string s) {stack<char> sta;//创建一个栈const char* temp=s.c_str();//遍历字符串的变量while(*temp!='\0'){//遍历if(*temp=='('||*temp=='{'||*temp=='['){//如果字符为左括号就入栈sta.push(*temp);}else{if(sta.empty()){//如果有右括号,没有左括号了,不闭合,失败return false;}if(sta.top()=='('){//右括号与左括号不匹配,不闭合,失败if(*temp!=')'){return false;}}else if(sta.top()=='{'){if(*temp!='}'){return false;}}else if(sta.top()=='['){if(*temp!=']'){return false;}}sta.pop(); }temp+=1;}if(!sta.empty()){return false;}return true;}
};

5.递归时间复杂度的计算

主方法求解递归式:T(n)=aT(n/b)+f(n) (n代表要处理数据的规模,T代表处理这个数据规模的时间消耗,a时子问题的个数,b分之n代表当前子问题处理的数据规模式原有数据量的几分之几,f(n)时除了递归以外要做的事情所用的时间消耗)

计算:比较nlogb的a次方和f(n),谁大谁就是递归的时间复杂度

​ 一样大的话,nlogb的a次方乘以log2的n次方就是递归的时间复杂度

6.计算器运算(应用栈)

1.中缀表达式(简称为表达式)

2.后缀表达式

3.中缀转后缀:

​ 1.借助辅助线

​ 2.遇到数字或字母,直接输出

​ 3.遇到符号,将当前符号与栈顶元素进行优先级比较

​ (1)当前符号优先级高,入栈

​ (2)当前符号优先级没有栈顶符号优先级高,栈内元素依次出栈,直到比当前元素优先级低为止,再将当前元素入栈

​ 4.遇到“(”无条件入栈,遇到")“栈内元素依次出栈,直到”)"停止

快速转换:把每个运算式都加上括号,括号里的运算符号都移到右括号外

4.后缀转前缀:

​ 1.借助辅助栈

​ 2.遇到数字或字母直接入栈

​ 3.遇到符号,将栈顶元素的下一个和栈顶元素构成表达式

二.队列:queue

1.队列的特点:

​ 先进先出:FIFO

2.队列的实现

顺序存储:数组实现:

​ 缺点:空间大小受限

​ 日和实现循环队列:进行取余 取余的是数组的长度

链式存储:链表实现

3.队列的基本函数(这里是一部分)

1.Init

2.Push

3.Pop

4.front

5.empty

将这里所有的函数功能进行实现

代码如下

#include <stdio.h>
#include<stdlib.h>
typedef struct node {int m_value;struct node* m_next;
}NODE;typedef struct node2 {int count;NODE* m_head;NODE* m_tail;
}P_POINT;//队列初始化
void init(P_POINT** point) {*point = (P_POINT*)malloc(sizeof(P_POINT));(*point)->count = 0;(*point)->m_head = NULL;(*point)->m_tail = NULL;
}//添加元素
void Push(P_POINT* point,int x) {if (point == NULL) return;NODE* Temp = (NODE*)malloc(sizeof(NODE));//创造节点Temp->m_value = x;//初始化Temp->m_next = NULL;if (point->m_head == NULL) {//头节点如果为空point->m_head = Temp;point->m_tail = Temp;printf("添加的元素为%d\n", Temp->m_value);}else {//头节点不为空point->m_tail->m_next = Temp;point->m_tail = Temp;printf("添加的元素为%d\n", Temp->m_value);}point->count += 1;
}//删除队头
void pop(P_POINT* point) {if (point == NULL) return;if (point->count == 0) return;NODE* Temp = point->m_head;point->m_head = point->m_head->m_next;printf("删除的元素为%d\n", Temp->m_value);free(Temp);point->count -= 1;if (point->count == 0) {point->m_tail = NULL;}
}//获得队头
void GetFront(P_POINT* point) {printf("队首为%d\n", point->m_head->m_value);
}//获得队列长度
void GetCount(P_POINT* point) {printf("获得队列的长度为%d\n",point->count);
}//判断队列是否为空
void IsEmpty(P_POINT* point) {if (point->count != 0) {printf("队列不为空\n");}else {printf("队列为空\n");}
}int main() {P_POINT* point = NULL;init(&point);//队列初始化Push(point, 5);//放入元素Push(point, 7);Push(point, 8);GetCount(point);//得到队列中元素的个数Push(point, 1);GetFront(point);//得到队头元素pop(point);//删除队列中的元素pop(point);pop(point);IsEmpty(point);//kreturn 0;
}

三.两个栈实现队列

实现:

​ 1.第一个栈进行入队,第二个栈进行出队

​ 2.当进行入队时,如果第二个栈中有元素,将第二个栈中的元素出栈并添加到第一个栈中,在第一个栈中添加新的元素

​ 3.当进行出队时,如果第一个栈中有元素,将第一个栈中的元素出栈并添加到第二个栈中,在第二个栈中进行弹出操作

两个栈实现队列的题(网址为https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/)

题目:

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTaildeleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

代码如下:

//这里的代码是c++语言下的
class CQueue {
public:CQueue() {}stack<int> sta1;stack<int> sta2;void appendTail(int value) {//添加元素while(!sta2.empty()){int temp=sta2.top();sta1.push(temp);sta2.pop();}sta1.push(value);}int deleteHead() {//删除元素while(!sta1.empty()){int temp=sta1.top();sta2.push(temp);sta1.pop();}if(sta2.empty()){return -1;}int temp2=sta2.top();sta2.pop();return temp2;}
};

四.两个队列实现栈

实现:

1.入栈:新元素添加到非空的队列中(第一次两个队列都为空,添加到哪个里面都可以)

2.出栈:将非空的队列中的元素除尾元素外都添加到另一个空队列里,然后将尾部的那个元素删除

用两个队列实现栈的题(网址为https://leetcode.cn/problems/implement-stack-using-queues/)

题目:

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppopempty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false

注意:

  • 你只能使用队列的基本操作 —— 也就是 push to backpeek/pop from frontsizeis empty 这些操作。
  • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

代码如下:

//这里的代码是c++语言下的
class MyStack {
public:MyStack() {}queue<int> q1;queue<int> q2;int bool1=1;void push(int x) {//添加元素if(bool1){q1.push(x);bool1=0;}else{if(!q1.empty()){q1.push(x);}else{q2.push(x);}}}int pop() {//移除并返回移除元素int temp=0;if(!q1.empty()){while(q1.size()>1){q2.push(q1.front());q1.pop();}temp=q1.front();q1.pop();}else{while(q2.size()>1){q1.push(q2.front());q2.pop();}temp=q2.front();q2.pop();}return temp;   }int top() {//获得栈顶元素int temp=0;if(!q1.empty()){while(q1.size()>1){q2.push(q1.front());q1.pop();}temp=q1.front();q2.push(q1.front());q1.pop();}else{while(q2.size()>1){q1.push(q2.front());q2.pop();}temp=q2.front();q1.push(q2.front());q2.pop();}return temp;}bool empty() {if(q1.empty()&&q2.empty()){return true;}return false;}
};/*** Your MyStack object will be instantiated and called as such:* MyStack* obj = new MyStack();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->top();* bool param_4 = obj->empty();*/

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

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

相关文章

无涯教程-Perl - sysread函数

描述 该函数等效于C /操作系统函数read(),因为它绕过了诸如print,read和seek之类的函数所采用的缓冲系统,它仅应与相应的syswrite和sysseek函数一起使用。 它从FILEHANDLE中读取LENGTH个字节,并将输出放入SCALAR中。如果指定了OFFSET,则将数据从OFFSET字节写入SCALAR,从而有效…

IC流程中 DFT 学习笔记(2)

引言 DFT是ASIC芯片设计流程中不可或缺的环节。其主要目的是在芯片前端设计验证完成后插入一些诸如寄存器链等可供测试的逻辑&#xff0c;算是IC后端设计的范畴&#xff0c;属于结构测试而非功能测试。主要是在ASIC芯片流片完成后&#xff0c;通过这些已插入的逻辑&#xff0c…

手机照片误删怎么办,电脑照片误删怎么办怎么才能找回,EasyRecovery来帮您

手机照片误删怎么办&#xff0c;电脑照片误删怎么办怎么才能找回&#xff0c;EasyRecovery 2023来帮您&#xff01;&#xff01;&#xff01; EasyRecovery 2023是一款操作安全、价格便宜、用户自主操作的 数据恢复 方案&#xff0c;它支持从各种各样的 存储介质 恢复删除 或者…

Vue3.X 创建简单项目

一、环境安装与检查 首先&#xff0c;我们要确保我们安装了构建vue框架的环境&#xff0c;不会安装的请自行百度&#xff0c;有很多安装教程。检查环境 node -v # 如果没有安装nodejs请安装&#xff0c;安装教程自行百度 vue -V# 没有安装&#xff0c;请执行npm install -g v…

Cesium for unity 1.5.0使用注意事项

Cesium for Unity Quickstart – Cesium 1.Unity版本仅支持Unity2021.3.2f1以后版 2.仅支持 3D (URP)和3D (HDRP)渲染管线 3.如果Package Manager中不出现My Registries选项&#xff0c;请在 Edit > Project Settings...>Package Manager中重命名或删除重新添加Packag…

深入浅出PHP封装根据商品ID获取淘宝商品详情数据方法

要通过淘宝的API获取商品详情&#xff0c;您可以使用淘宝开放平台提供的接口来实现。以下是一种使用PHP编程语言实现的示例&#xff0c;展示如何通过淘宝开放平台API获取商品详情&#xff1a; 首先&#xff0c;确保您已注册成为淘宝开放平台的开发者&#xff0c;并创建一个应用…

【微服务实战】01-工程结构概览

文章目录 工程结构概览:定义应用分层及依赖关系1.应用分层2.定义Entity3.仓储层3.1 工作单元&#xff1a;事务管理3.2 仓储层 4.领域事件5.APIController最佳实践 工程结构概览:定义应用分层及依赖关系 1.应用分层 领域模型层基础设施层 ⇒ 仓储应用层 ⇒ Api、后台任务Job共…

TCP服务器实现—多进程版,多线程版,线程池版

目录 前言 1.存在的问题 2.多进程版 3.多线程版 4.线程池版 总结 前言 在上一篇文章中使用TCP协议实现了一个简单的服务器&#xff0c;可以用来服务端和客户端通信&#xff0c;但是之前的服务器存在一个问题&#xff0c;就是当有多个客户端连接服务器的时候&#xff0c;服…

002-Spring boot 自动配置相关分析

目录 自动配置 EnableAutoConfiguration开启自动配置读取配置提前过滤自动配置配置包 AutoConfigurationPackage 自动配置 EnableAutoConfiguration 开启自动配置 在Spring 启动类上的 SpringBootApplication 中有 EnableAutoConfiguration 读取配置 Import(AutoConfigurat…

后端返回图片,前端接收并显示的解决方案

后端图片数据返回 后端通过二进制流的形式&#xff0c;写入response中 controller层 /*** 获取签到二维码*/GetMapping("/sign-up-pict")public void signUpPict(Long id, Long semId, HttpServletResponse response) throws NoSuchAlgorithmException {signUpServ…

musl libc ldso 动态加载研究笔记:01

前言 musl 是一个轻量级的标准C库&#xff0c;建立在系统调用之上&#xff0c;可以认为是【用户态】的C 库&#xff0c;与 glibc 或者 uClibc 属于同一类。 基于 musl 的 gcc 工具链包括交叉编译工具链&#xff0c;可以用于编译 Linux 或者其他的操作系统&#xff0c;如当前 L…

深入解析 MyBatis 中的 <foreach> 标签:优雅处理批量操作与动态 SQL

在当今的Java应用程序开发中&#xff0c;数据库操作是一个不可或缺的部分。MyBatis作为一款颇受欢迎的持久层框架&#xff0c;为我们提供了一种优雅而高效的方式来管理数据库操作。在MyBatis的众多特性中&#xff0c;<foreach>标签无疑是一个强大的工具&#xff0c;它使得…

构建可远程访问的企业内部论坛

文章目录 前言1.cpolar、PHPStudy2.Discuz3.打开PHPStudy&#xff0c;安装网页论坛所需软件4.进行网页运行环境的构建5.运行Discuz网页程序6.使用cpolar建立穿透内网的数据隧道&#xff0c;发布到公网7.对云端保留的空白数据隧道进行配置8.Discuz论坛搭建完毕 前言 企业在发展…

Python中import模块导入的实现原理

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 Python中import模块导入的实现原理 什么是模块import搜索路径import导入模块的原理图书推荐 专栏&…

京东门详一码多端探索与实践 | 京东云技术团队

本文主要讲述京东门详业务在支撑过程中遇到的困境&#xff0c;面对问题我们在效率提升、质量保障等方向的探索和实践&#xff0c;在此将实践过程中问题解决的思路和方案与大家一起分享&#xff0c;也希望能给大家带来一些新的启发 一、背景 1.1、京东门详介绍 1.1.1、京东门…

VB+SQL上机考试系统设计与实现

摘 要 随着计算机技术的迅猛发展,学校教学和管理的信息化发展也有长足的进步,这就要求各个环节都均衡发展,从软硬件双方面把学校建设成一流的信息管理、教育教学的平台。本文设计开发的考试管理系统也是其中重要的一个方面。该系统本着减轻教师工作负担、提高工作效率、优…

六、分组背包

六、分组背包 题记算法题目代码 题记 一个旅行者有一个最多能装V公斤的背包和有N件物品&#xff0c;它们的重量分别是W[1]&#xff0c;W[2]&#xff0c;…,W[n]&#xff0c;它们的价值分别为C[1],C[2],…,C[n]。这些物品被划分为若干组&#xff0c;每组中的物品互相冲突&#…

【es6】函数参数设置默认值

1、es6之前的函数参数默认值写法 1.1、使用短路或||的写法 当y为空时&#xff0c;y判断为false &#xff0c;走||右边的&#xff0c;所以y world;当y不为空时&#xff0c;y判断为true&#xff0c;不需要再运行||右边的&#xff0c;所以 y y function log(x, y) {y y || W…

数据的深海潜行:数据湖、数据仓库与数据湖库之间的微妙关系

导言&#xff1a;数据的重要性与存储挑战 在这个信息爆炸的时代&#xff0c;数据已经成为企业的核心资产&#xff0c;而如何高效、安全、便捷地存储这些数据&#xff0c;更是每个组织面临的重大挑战。 数据作为组织的核心资产 数据在过去的几十年里从一个辅助工具演变成企业的…

Ubuntu 20.04(服务器版)安装 Anaconda

0、Anaconda介绍 Anaconda是一个开源的Python发行版本&#xff0c;包含了包括Python、Conda、科学计算库等180多个科学包及其依赖项。因此&#xff0c;安装了Anaconda就不用再单独安装CUDA、Python等。 CUDA&#xff0c;在进行深度学习的时候&#xff0c;需要用到GPU&#xf…