植物百科网
当前位置: 首页 农业百科

数据结构栈和队列的思考题(数据结构系列4栈和队列)

时间:2023-06-08 作者: 小编 阅读量: 1 栏目名: 农业百科

进行插入和删除的一端称作栈顶,另一端称为栈底。栈中的元素遵循先进后出的原则。链表的特性是先进先出。插入操作就是对链表的尾插,删除操作就是链表的头删队列的C语言实现1:队列的结构定义队列使用单链表存储的,单链表的每个结点定义为QNode,然后使用两个指针front,rear指向QNode的头结点和尾节点2:初始化和销毁3:入队4:出队正常情况出栈很简单,但是要注意一个非常特殊的情况那

如果需要获取工程文件,优秀算法书籍,算法刷题攻略及算法刷题视频,请关注公众号【0与1】,并在后台回复【数据结构】

一:栈(1)栈的概念

栈:栈是一种特殊的线性表,元素只能在一端插入和删除。进行插入和删除的一端称作栈顶,另一端称为栈底。栈中的元素遵循先进后出的原则。

(2)压栈与出栈

压栈:栈的插入操作称为压栈,栈顶入数据出栈:栈的删除操作称为出栈,栈顶也出数据如下:栈顶固定,栈顶随元素插入和删除动态变化

上面的栈使用数组实现的,栈也可以用链表保存,如果是双向链表,哪一边作头或作尾都是可以的,但如果是单链表,为了操作的便利性,要注意方向

实现栈建议使用数组

(3)栈的C语言实现1:栈的结构定义

和顺序表一样,栈也有静态和动态的,但是静态的不使用,所以使用动态栈

2:栈的初始化

(注意修改一下ps->_top=-1)

3:增容4:进栈

入栈时有一个放元素和移动指针的顺序问题,这一点要看你初始化时top的值是多少,如果初始化top=-1,那么就要先移动指针,再放元素。如果top=0,那么就要先放元素然后移动指针。

5:出栈6:清空栈7:取栈顶元素

8:打印

(4)总结
  • 栈的先进后出规则是相对于栈中的元素而言的,并不是绝对的
  • 栈经常用于有先进后出的需求场景中,如迷宫问题,括号匹配问题,表达式转换问题,还有递归转非递归等问题
(5)实现代码

Stack.h

#pragma once#include <stdio.h>#include <stdlib.h>#include <assert.h>typedef int SLDatatype;//typedef struct Stack//静态栈,实际中不使用//{//int top;//SLDatatype* _arr;//}Stack;typedef struct Stack{SLDatatype* _arr;int _top;//栈顶int _capacity;//容量}Stack;void StackInit(Stack* ps);//栈的初始化void StackDestory(Stack* ps);//销毁栈void StackAddCapacity(Stack* ps);//打印栈void StackPrint(Stack* ps);//打印栈void StackPush(Stack* ps,SLDatatype x);//进栈void StackPop(Stack* ps);//出栈int StackEmpty(Stack* ps);//清空栈(1表示成功)SLDatatype StackTop(Stack* ps);//获取栈顶元素123456789101112131415161718192021222324252627282930

//Stack.c

#include "stack.h"void StackInit(Stack* ps){assert(ps);ps->_arr = (SLDatatype*)malloc(sizeof(SLDatatype) * 4);ps->_top = -1;ps->_capacity = 4;}void StackDestory(Stack* ps){assert(ps);free(ps->_arr);ps->_arr = NULL;ps->_top = -1;ps->_capacity = 0;}void StackPrint(Stack* ps){assert(ps);int k = ps->_top 1;while (k--){printf("%d ", ps->_arr[k]);}}void StackAddCapacity(Stack* ps){assert(ps);ps->_capacity *= 2;SLDatatype* temp = (SLDatatype)realloc(ps->_arr,sizeof(SLDatatype)*ps->_capacity);ps->_arr = temp;}void StackPush(Stack* ps,SLDatatype x){assert(ps);if (ps->_top == ps->_capacity-1)StackAddCapacity(ps);ps->_top;ps->_arr[ps->_top] = x;}void StackPop(Stack* ps){assert(ps);if (ps->_top == -1){printf("栈为空\n");exit(-1);}ps->_top--;}int StackEmpty(Stack* ps){assert(ps);if (ps->_top == -1){printf("栈已经清空\n");return 1;}return 0;}SLDatatype StackTop(Stack* ps){assert(ps);if (StackEmpty){printf("栈空\n");exit(-1);}return ps->_arr[ps->_top];}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879

test.c

#include "stack.h"void test(){Stack stack;StackInit(&stack);StackPush(&stack, 1);StackPush(&stack, 2);StackPush(&stack, 3);StackPush(&stack, 4);StackPush(&stack, 5);StackPush(&stack, 5);StackPush(&stack, 5);StackPush(&stack, 5);StackPush(&stack, 5);StackPrint(&stack);//StackDestory(&stack);}int main(){test();}123456789101112131415161718192021222324

二:队列(1)队列的概念

队列:是一种特殊的线性表,只允许在一端插入数据,在另一端删除数据。链表的特性是先进先出。进行插入操作的一端称之为队尾,进行删除操作的一端称之为队头

(2)入队与出队

入队:队列的插入操作,在队尾插入元素出队:队列的删除操作,在队尾删除元素

和栈一样,队列同样可以用数组和链表实现,但是如果使用数组实现队列,插入操作可以很好的实现,但是删除操作势必会移动元素,效率不高。所以使用单链表来实现链表,而且单链表的结构很好的满足了链表。插入操作就是对链表的尾插,删除操作就是链表的头删

(3)队列的C语言实现1:队列的结构定义

队列使用单链表存储的,单链表的每个结点定义为QNode,然后使用两个指针front,rear指向QNode的头结点和尾节点

2:初始化和销毁3:入队4:出队

正常情况出栈很简单,但是要注意一个非常特殊的情况那就是队列中只有一个结点,也即pq->front==pq->rear,此时要特殊处理,将front和rear都置为空(同时注意打印函数也要相应做处理),否则将发生NULL错误

5:取队头和队尾6:判断链表是否为空7:调用接口进行出队操作(4)总结
  • 队列常用于有先进先出的需求场景中,比如要保持序列公平(排队抽号机 ),生产消费者模, 广度优先遍历
(5)实现代码

头条号有字数限制,只能用图片代替,如需要代码,可移步 https://blog.csdn.net/qq_39183034/article/details/113179959

    推荐阅读
  • 空气含量中最多的气体(空气含量中最多的气体介绍)

    空气中含量最多的气体是氮气,氮气约占空气体积分数的百分比约为78%。通过实验测定,空气的成分按体积计算,氮气大约占78%、氧气占21%、稀有气体0.94%、二氧化碳0.03%、其他气体和杂质0.03%,也就是说空气中含量最多的物质是氮气。氮气化学性质很不活泼,在高温高压及催化剂条件下才能和氢气反应生成氨气;在放电的情况下才能和氧气化合生成一氧化氮;即使Ca、Mg、Sr和Ba等活泼金属也只有在加热的情形下才能与其反应。

  • 文思豆腐羹如何做好吃(文思豆腐羹用什么豆腐)

    文思豆腐是一道有名的淮扬菜,需要的就是精湛的刀工,这样做出的文思豆腐会有嫩滑的口感,打造入口即化的口感。文思豆腐羹如何做好吃文思豆腐羹材料和做法步骤一、文思豆腐羹材料准备好豆腐400克,鸡脯肉,火腿还有香菇,再有准备好生菜,冬笋,调料需要准备盐和味精。

  • 结构性存款可以买理财吗(结构性存款是存款吗)

    雪球产品就是今年年初监管向信托公司进行窗口指导,要求叫停的产品。简单的说,这是一种高风险的金融衍生品,它通过持有一定结构的金融衍生品,来实现在某一特定情况下获利。这样的投资结构就能保证我不论涨,还是跌,只要在一定幅度内都可以盈利。交易期权等金融衍生品,是非常高风险的投资。

  • 正言厉色意思(正言厉色的意思)

    下面内容希望能帮助到你,我们来一起看看吧!正言厉色意思正言厉色,汉语成语,拼音是zhènɡyánlìsè,意思是形容板着脸,神情非常严厉。出自《汉书·王莽传》。宝玉突然想出一个主意,一本正经地给她讲扬州黛山林子洞耗子精偷香芋的故事,黛玉见他正言厉色,以为真有其事,后来才发现原来是在取笑她。

  • 面谈调薪酬有什么技巧(跟老板谈调薪的技巧有哪些)

    如果你在老板心目中分量很大,一般老板都会给你加薪的。和老板谈加薪时目的一定要明确,让老板知道你只是为了加薪,而不是辞职走人。和老板谈加薪后,一定要给老板一个考虑的时间,不要咄咄逼人,逼着老板加薪。老板也要有足够的思考时间,来考虑你是否值得加薪,给你加薪后对公司有没有什么影响。不仅口头上要表示感谢,工作中要更加努力,让老板觉得给你加薪是值得的。

  • 杏花有没有香味(杏花闻起来会特别香吗)

    杏树是中国著名的观赏树木,可配植于庭前、墙隅、道路旁、水边,也可群植、片植于山坡、水畔,是春季主要的观赏树种。杏花直径2至3厘米,先于叶开放。花梗短,长1至3毫米,被短柔毛。花萼紫绿色,萼筒圆筒形,外面基部被短柔毛。萼片卵形至卵状长圆形,先端急尖或圆钝,花后反折。花瓣圆形至倒卵形,白色或带红色,具短爪。

  • 减肥减肚子的方法(怎么减肚子呢)

    减肥减肚子的方法食用健康食品:酸奶与发酵的牛奶能激活消化必须的物质,有助于改善肠道微生物系统,从而防止腹部隆起。走路、喝水、按摩:走路及喝水有利腹部扁平。

  • 新坑翡翠手镯多少钱(新坑翡翠手镯的价格)

    新坑翡翠手镯多少钱?新坑翡翠手镯多少钱翡翠手镯作为大件翡翠制品,用料特别多,只有大块、质量好的翡翠原石才能打造成手镯,因此翡翠手镯的价格都比较高,商家们拿到质量比较好的原石也尽可能打造成手镯。具体到新坑种翡翠,因为大多数新坑种翡翠透明度都不高,质地也不够细腻,因此种水一般都是以糯种或豆种为主,极少出现冰种或冰种以上的种水,这样的翡翠价格价格自然不会太高,一个品质比较好的糯种翡翠手镯大概在十万以内。

  • 宁波毛蚶做法水煮几分钟(毛蚶煮多长时间可以吃)

    宁波毛蚶做法水煮几分钟毛蚬是很多人喜欢吃的食物,不过建议大家在做之前都要先用开水煮以下。强精益气,提高精液质量,增强精子活力。适用于治疗肾阳虚所致的阳痿、腰痛、小便频数及补五脏之气不足。可治疗全身水肿,小便不利等。能软化和保护血管,有降低人体中血脂和胆固醇的作用。

  • 2022洛阳湿地公园最新名单 洛阳生态公园最新消息

    国家级湿地自然保护区河南黄河湿地国家级自然保护区,面积24000公顷。国家级湿地公园嵩县陆浑湖国家湿地公园,面积4222.39公顷伊川伊河国家湿地公园,面积1384.36公顷。