当前位置: 首页 > news >正文

队列及笔试题

队列

先进先出

使用单链表进行队尾插入 队头删除

其中带头结点直接尾插,不带头结点第一次操作要判断一下

但是带头结点需要malloc和free

函数传需要修改的参数方法

1、二级指针

2、带哨兵位的头结点

3、返回值

4、如果有多个值,用结构体封装起来

可以把头指针和尾指针放到结构体里面,就不用二级指针了。

他们是结构体成员,想要改变就可以用结构体指针

Queue.h

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>typedef int QDataType;typedef struct QueueNode {QDataType val;struct QueueNode* next;
}QNode;typedef struct Queue {QNode* phead;QNode* ptail;int size;
}Queue;void QInit(Queue* pq);
void QDestroy(Queue* pq);
void QPush(Queue* pq, QDataType x);
void QPop(Queue* pq);//取队头的数据
QDataType QFront(Queue* pq);//取队尾的数据
QDataType QBack(Queue* pq);//判断链表是否为空
bool QEmpty(Queue* pq);//求队长度
int QSize(Queue* pq);

Queue.c

#define  _CRT_SECURE_NO_WARNINGS
#include"Queue.h"void QInit(Queue* pq) {assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}void QDestroy(Queue* pq) {assert(pq);QNode* cur = pq->phead;while (cur) {pq->phead = pq->phead->next;free(cur);cur = pq->phead;pq->size --;}pq->ptail = NULL;
}void QPush(Queue* pq, QDataType x) {assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL) {perror("malloc");return;}newnode->next = NULL;newnode->val = x;if (pq->phead == NULL) {pq->phead = newnode;pq->ptail = newnode;}else {pq->ptail->next = newnode;pq->ptail = pq->ptail->next;}pq->size++;
}void QPop(Queue* pq) {assert(pq);assert(pq->phead);QNode* del = pq->phead;pq->phead = pq->phead->next;free(del);del = NULL;if (pq->phead == NULL) {pq->ptail = NULL;}pq->size--;
}//取队头的数据
QDataType QFront(Queue* pq) {assert(pq);assert(pq->phead);return pq->phead->val;
}//取队尾的数据
QDataType QBack(Queue* pq) {assert(pq);assert(pq->phead);return pq->ptail->val;
}//判断链表是否为空
bool QEmpty(Queue* pq) {assert(pq);return pq->phead == NULL;
}//求队长度
int QSize(Queue* pq) {assert(pq);return pq->size;
}

Test.c

#define  _CRT_SECURE_NO_WARNINGS
#include"Queue.h"int main() {Queue q;QInit(&q);QPush(&q, 1);QPush(&q, 2);QPush(&q, 3);QPush(&q, 4);QPush(&q, 5);int size = QSize(&q);printf("%d\n", size);while (!QEmpty(&q)) {printf("%d ", QFront(&q));QPop(&q);}printf("\n");size = QSize(&q);printf("%d\n", size);QDestroy(&q);
}

练习:

用队列实现栈

这里有typedef,MyStack就是类型

没有typedef,MyStack就是变量,且这个结构体只能创建这一个变量

思路:

空的队列用来出仅存的那一个数据

满的队列用来存剩下的全部数据

如果直接free(obj),则相当于只free了这个结构体,但是链表里可能还有数据,所以要先分别Destroy一下

用栈实现队列

思路:

1、建立两个栈,一个用来存放数据(pushst),一个用来改变成正确的顺序然后出栈(popst)

      等popst出空了再倒过来数据,效率更高

2、凡是看到这样一个返回值,都需要malloc,否则只是创建了局部变量,出了作用域就被销毁了

3、此处可以手动初始化栈,也可以调用之前写好的完整的一套函数去初始化(推荐)

访问结构体里的变量用 . 

4、内部实现

STInit需要传的是栈的地址,对栈进行操作

5、结构体 和 结构体的指针 是有区别的,结构体的指针只是一个地址。

如果定义结构体时定义成了上面这样

则相当于malloc了pushst和popst这两个指针,但是这两个指针没有具体只的内容和空间,如果没有初始化就是野指针。同时还需要malloc栈的空间

相关文章:

  • IO(Reader/Writer)
  • C#的Socket编程细节
  • 每日一练:从前序遍历与中序遍历序列构造二叉树
  • 这是一个悲惨的故事
  • (十七)、Mac 安装k8s
  • Miniforge详细安装教程(macOs和Windows)
  • mongoDB快速上手
  • vue按钮接收键盘回车事件
  • 云栖3天,云原生+ AI 多场联动,新产品、新体验、新探索
  • 卸载apt-get 安装的PostgreSQL版本
  • HTML5+JavaScript绘制闪烁的网格错觉
  • 基于php的酒店管理系
  • 【Python】数据可视化之点线图
  • 后端人需知
  • Spring Boot 进阶- Spring Boot 自定义拦截器详解
  • CSS居中完全指南——构建CSS居中决策树
  • Facebook AccountKit 接入的坑点
  • JavaScript DOM 10 - 滚动
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • magento2项目上线注意事项
  • Spark学习笔记之相关记录
  • Swoft 源码剖析 - 代码自动更新机制
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 分享一份非常强势的Android面试题
  • 聊聊redis的数据结构的应用
  • 前端临床手札——文件上传
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 设计模式 开闭原则
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 为什么要用IPython/Jupyter?
  • 系统认识JavaScript正则表达式
  • 学习HTTP相关知识笔记
  • 再谈express与koa的对比
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 找一份好的前端工作,起点很重要
  • 回归生活:清理微信公众号
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • #QT(TCP网络编程-服务端)
  • #WEB前端(HTML属性)
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (11)MATLAB PCA+SVM 人脸识别
  • (2)(2.10) LTM telemetry
  • (C)一些题4
  • (C++)八皇后问题
  • (C++20) consteval立即函数
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (二)原生js案例之数码时钟计时
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (计算机网络)物理层
  • (简单) HDU 2612 Find a way,BFS。
  • (一)认识微服务
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)关于多人操作数据的处理策略