链表栈与队列 C语言实现

!!!本代码学习参考部分较多,仅供提交作业及课内交流使用,并无任何借鉴价值。

链表栈

//Author DICTATOR
//This is Stack Code#include<stdio.h>
#include<stdlib.h>typedef struct Node{int data;struct Node* next;}node;typedef struct Stack{  //此代码采用栈顶栈尾双指针node* top;node* buttom;}stack;stack* CreatEmptyStack(){  //初始化node* NewNode = (node*)malloc(sizeof(node));NewNode->next = NULL;stack* st = (stack*)malloc(sizeof(stack));st->top = st->buttom = NewNode;return st;}void Push(stack* st,int data){  //元素入栈node* NewNode = (node*)malloc(sizeof(node));NewNode->data = data;NewNode->next = st->top;st->top = NewNode;}int IsEmpty(stack* st){  //判断栈是否为空return st->top == st->buttom;  //若栈顶指针与栈尾指针相同,则栈为空}void Pop(stack* st){  //元素出栈if (IsEmpty(st)){  //判断是否为空return;}node* temp = st->top;printf("%d\n",temp->data);  //为了有出栈的直观反映,在此函数中printfst->top = temp->next;free(temp);  //释放内存}void Clear(stack* st){  //清空栈if (IsEmpty(st)){return;}node* temp1 = st->top;node* temp2 = NULL;while (temp1 != st->buttom){  //temp1与栈尾指针相同时,栈完成清空temp2 = temp1->next;free(temp1);temp1 = temp2;free(temp2);}st->top = st->buttom;  //将栈顶赋为栈尾printf("栈清空完成!\n");}void Destory(stack* st){  //销毁栈Clear(st);  //首先完成清空free(st);  //释放栈内存st = NULL;printf("栈已销毁!\n");}int main(){int k;int n = 5;  //为了方便书写,随意取了5作为入栈元素数量stack* st;st = CreatEmptyStack();printf("开始进栈:\n");while (n--){scanf("%d",&k);Push(st,k);}Pop(st);Pop(st);Clear(st);Destory(st);return 0;}

将链表熟悉后,栈的代码书写并没有那么困难。但目前个人觉得链表栈的运用范围比较小,后进先出的限制局限了栈的使用。 并且个人并没有体会到链表栈优于数组栈的方面。

链表队列

//Author DICTATOR
//This is queue code#include<stdio.h>
#include<stdlib.h>typedef struct Node{int data;struct Node* next;}node;typedef struct Queue{node* head;node* tail;}queue;queue* CreatEmptyQueue(){  //初始化queue* qu = (queue*)malloc(sizeof(queue));qu->head = qu->tail;return qu;}node* ListHeadDelelte(node* head){  //定义头删,用于出队if(head){node* temp = head->next;free(head);return temp;}return head;}int IsEmpty(queue* qu){return qu->head == qu->tail;}void Push(queue* qu,int data){  //入队node* NewNode = (node*)malloc(sizeof(node));NewNode->data = data;if(!qu->head){qu->head = qu->tail = NewNode;return;}NewNode->next = qu->tail->next;  //新节点进行尾插qu->tail->next = NewNode;qu->tail = NewNode;return;}void Pop(queue* qu){  //出队printf("%d\n",qu->head->data);qu->head = ListHeadDelelte((node*)qu->head);return;}void Clear(queue* qu){  //类似于栈的清空if (IsEmpty(qu)){return;}node* temp1 = qu->head;node* temp2 = NULL;while (temp1 != qu->tail){temp2 = temp1->next;free(temp1);temp1 = temp2;free(temp2);}qu->head = qu->tail;printf("队列清空完成!\n");}void Destory(queue* qu){Clear(qu);free(qu);qu = NULL;printf("队列已销毁!\n");}int main(){queue* qu = CreatEmptyQueue();Push(qu,3);  //为了方便书写检验,这里简单取三个入队Push(qu,4);Push(qu,5);Pop(qu);Destory(qu);      return 0;}

队列与栈的区别个人感觉不大,但是队列的书写会稍微麻烦一点。总之熟练掌握链表可以较快掌握。

DICTATOR第三周栈与队列作业相关推荐

  1. [LeetCode]-Python刷题第三周(栈和队列)

    20. Valid Parentheses 合法括号(Easy) Given a string containing just the characters '(', ')', '{', '}', ' ...

  2. C语言数据结构-第三章栈和队列-电大同步进度

    第三章栈和队列简介 从数据结构角度看,栈和队列是两种重要的线性结构,是一类操作受限制的特殊线性表,其特殊性在于限制插入和删除等运算的位置. 堆栈,限制用户只能在指定的一端插入和删除元素,因此具有后进先 ...

  3. (王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀、中缀和后缀)

    前面我们就说过,栈是一种先进后出的线性表,这种先进后出的特性就决定了它在一类场合或问题中会经常被用到--递归.考研数据结构中所涉及的利用栈结构解决递归问题或者考察栈结构特性的问题主要有这么几类 括号匹 ...

  4. 王道考研408 数据结构 第三章 栈、队列与数组

    第三章 栈.队列与数组 3.1 栈 3.1.03 假设以I和O分别表示入栈和出栈操作.栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则称为非法序 ...

  5. 数据结构-第三章-栈和队列(5)-链队

    数据结构 ⚡️数据结构-第一章 ⚡️抽象数据类型案例 ⚡️数据结构-第二章(1)-线性结构 ⚡️数据结构-第二章(2)-线性表的顺序表示和实现 ⚡️数据结构-第二章(3)-顺序表(含代码) ⚡️数据结 ...

  6. 第三章栈和队列-作业题

    第三章栈和队列-作业题 1.栈和列队的基本概念 6-1 使用栈完成回文判断 (12 分) 6-2 判断表达式中括号是否匹配 (12 分) 6-3 队列的操作集合(带尾指针的循环链表) (18 分) 6 ...

  7. C语言数据结构【手抄版】第三章 栈和队列

    注意:文中彩色代码均在Visual Studio 2022编译器中编写,本文为C语言数据结构手抄版,文中有部分改动,非原创. 目录 注意:文中彩色代码均在Visual Studio 2022编译器中编 ...

  8. 《数据结构》实验三:栈和队列实验 (实验报告)

    一.实验目的 巩固栈和队列数据结构,学会运用栈和队列. 1.回顾栈和队列的逻辑结构和受限操作特点,栈和队列的物理存储结构和常见操作. 2.学习运用栈和队列的知识来解决实际问题. 3.进一步巩固程序调试 ...

  9. 王道数据结构课代表 - 考研数据结构 第三章 栈和队列 究极精华总结笔记

    本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对数据结构知识点的理解的总结.希望对新一届的计算机考研人提供帮助!!!   关于对 栈和队列 章节知识点总结的十分全面,涵括了<王道数 ...

最新文章

  1. Swift Objective-C 访问级别控制
  2. Java - concurrent包详解
  3. Django手写登录装饰器
  4. mac找不到mysql_mac找不到mysql
  5. C++笔记-利用远程线程注入获取PC版微信个人昵称
  6. Java并发编程之Semaphore信号量
  7. biee12c连接hive_BIEE 12c Linux下连接Hadoop Hive
  8. 用批处理共享打印机电脑设置
  9. 【ArcGIS】Packaging succeeded,but publishing failed unable to connect to publishing tools service
  10. 2017cad光标大小怎么调_怎么设置CAD中十字光标的长度
  11. java中nextToken,Java StringTokenizer nextToken()用法及代碼示例
  12. 开水果店流程,开水果店的流程
  13. 饿了么:业务井喷时,订单系统架构这样演进
  14. find()的基本使用
  15. Apple 的 WWDC 2022 活动时间以及观看方法
  16. ArcGIS中根据DEM提取等高线和高程点(附练习数据)
  17. 局域网访问提示无法访问检查拼写_win10无法访问局域网电脑 请检查名称的拼写...
  18. android获取视频头一帧,music信息
  19. matlab中计算标准差std函数
  20. Solaris培训第二章:OpenBoot PROM(转)

热门文章

  1. ReactNative解决方案研究
  2. 微信小游戏-飞机游戏玩法改造系列(二:支持血条)
  3. 【笔记】Oracle删除项目编号多余的数据
  4. LCD液晶屏驱动详解
  5. 操作系统课程设计-二级文件系统,Linux平台版本,c语言
  6. TOP 1比不加TOP慢的疑惑
  7. 向量ab怎么用计算机打出来,数学ab上面加一横线-数学符号如何打?急急急!!!向量AB上的剪 – 手机爱问...
  8. 数据分析三剑客之特征值提取(七)
  9. win7搜索功能失效/win7搜索功能不能使用
  10. 常用传感器讲解十--光传感器根据亮度安排灯光