C语言---栈和队列

article/2025/11/7 13:30:39

严格来说,栈和队列都属于线性表

"一对一"

栈:"先进后出"

队列: "先进先出"

  1. 栈只能从一端存取,另一端是封闭的

  2. 在栈中,不论是存还是取,都必须遵循"先进后出"的原则

==>栈是一种只能从表的一端存取数据,且遵循"先进后出"原则的线性存储结构

进栈和出栈

进栈:将数据存储到栈里面去

出栈:将数据从栈中间取出来

栈的实现方法

栈:有点"特殊"的线性存储结构

  1. 顺序表==>顺序栈 (顺序存储结构)

  2. 链表==>链栈 (链式存储结构)

顺序栈

#include <stdio.h> 
// ** 元素进栈 
// 参数: 存储结构,栈顶指针,数据 
// 返回值: 栈顶指针 
int pushElem(int* arr, int top, int val) 
{ arr[++top] = val; return top; 
}
// ** 元素出栈 
// 参数: 存储结构,栈顶指针 
// 返回值: 栈顶指针 
int popElem(int* arr, int top) 
{ // 先判断 if (top <= -1) { printf("空栈!\n"); return -1; }printf("元素%d出栈\n",arr[top]); top--; // 原来的数据还在 return top; 
}
​
int main() 
{ // 数组 int a[100]; // top指针(下标) int top = -1; // 入栈 top = pushElem(a, top, 1); top = pushElem(a, top, 2); top = pushElem(a, top, 3); top = pushElem(a, top, 4);top = pushElem(a, top, 5); // 出栈 top = popElem(a, top); top = popElem(a, top); top = popElem(a, top); top = popElem(a, top); top = popElem(a, top); return 0; 
}

链栈

一般会将链表的头部作为栈顶,尾部作为栈底

#include <stdio.h> 
#include <stdlib.h> 
// 节点 
typedef struct Node 
{ int data; struct Node* pnext; 
}Node; 
// **添加元素 
// 参数: 头指针,数据 
// 返回值: 头指针 
Node* push(Node* stack, int a) 
{ // 1 申请内存 Node* NewNode = (Node*)malloc(sizeof(Node)); // 2 初始化节点的数据域 NewNode->data = a; // 3 把新的节点作为新的头节点 NewNode->pnext = stack; // 4 头指针指向新的头节点 stack = NewNode; // 5 返回头指针 return stack; 
}
// **删除元素 
// 参数: 头指针 
// 返回值: 头指针 
Node* pop(Node* stack) 
{ // 判断是否为空 if (stack) { // 临时指针保存栈顶(头指针) Node* p = stack; // 头指针后移 stack = stack->pnext; // 打印一下数据printf("弹出原来栈顶元素:%d ", p->data); // 再次判断一下是否到了栈底 if (stack) { printf("现在栈顶元素:%d\n", stack->data); }else { printf("栈已经空了!\n"); }// 释放节点 free(p); p->pnext = NULL; }else { printf("是一个空栈!\n"); }return stack; 
}
​
int main() 
{ Node* stack = NULL; // 入栈 stack = push(stack, 1); stack = push(stack, 2); stack = push(stack, 3); stack = push(stack, 4); stack = push(stack, 5); // 出栈 stack = pop(stack); stack = pop(stack); stack = pop(stack); stack = pop(stack); stack = pop(stack); return 0; 
}

队列

队列的两端都"开口",要求:只能从一端进入队列,从另一端出队列

队头和队尾

队头: 数据出队列的一端

队尾: 数据进入队列的一端

队列的实现方法

  1. 顺序表==>顺序队列

  2. 链表==>链队列

顺序队列

#include <stdio.h> 
// **入队 
// 参数: 存储结构,队尾,数据 
// 返回值: 队尾 
int enQueue(int* a, int rear, int data) 
{ // rear: 即将添加数据的位置 a[rear] = data; rear++; return rear; 
}
// **出队 
// 参数: 存储结构,队头,队尾 
// 返回值: 无 
void deQueue(int* a, int front, int rear) 
{ // 如果 front == rear,表示队列为空 while (front != rear) { printf("出队元素:%d\n", a[front]); front++;} 
}
​
int main() 
{ // 数组 int a[100]; // 队头和队尾 int front, rear; // 当队列中没有元素的时候,队头和队尾是同一个地方 front = rear = 0; // 入队 rear = enQueue(a, rear, 1); rear = enQueue(a, rear, 2); rear = enQueue(a, rear, 3); rear = enQueue(a, rear, 4); rear = enQueue(a, rear, 5); // 出队 deQueue(a, front, rear); return 0; 
}

缺点明显,应当改善

栈队列

#include <stdio.h> 
#include <stdlib.h> 
// 节点 
typedef struct QNode 
{ int data; struct QNode* next; 
}QNode; 
​
// 创建队列(头节点) 
QNode* initQueue()
{ // 创建头节点 QNode* queue = (QNode*)malloc(sizeof(QNode)); // 给值 queue->data = 0; // 这句可以不写 queue->next = NULL; return queue; 
}
​
// 入队 
QNode* enQueue(QNode* rear, int data) 
{ // 1 做一个新的节点 QNode* NewNode = (QNode*)malloc(sizeof(QNode)); NewNode->data = data; NewNode->next = NULL; // 2 使用尾插法添加 rear->next = NewNode; rear = NewNode; return rear; 
}
// 出队 
QNode* deQueue(QNode* top, QNode* rear) 
{ if (top->next == NULL) { printf("队列为空!\n"); return rear; }// 创建临时指针 QNode* p = top->next; // 显示数据 printf("%d ", p->data); // 断头,换头 p->next可能为NULL top->next = p->next; // 判断(是否即将只剩下一个节点) if (rear == p) { rear = top; }// 释放 free(p); return rear; 
}
​
int main() 
{ QNode* queue, *top, *rear; queue = top = rear = initQueue(); // 入队 rear = enQueue(rear, 1); rear = enQueue(rear, 2); rear = enQueue(rear, 3); rear = enQueue(rear, 4);rear = enQueue(rear, 5); // 出队 rear = deQueue(top, rear); rear = deQueue(top, rear); rear = deQueue(top, rear); rear = deQueue(top, rear); rear = deQueue(top, rear); rear = deQueue(top, rear); return 0; 
}

http://chatgpt.dhexx.cn/article/xXOSbYvw.shtml

相关文章

数据结构与算法——栈和队列

&#x1f60a;数据结构与算法——栈和队列 &#x1f680;前言&#x1f680;栈&#xff08;satck&#xff09;&#x1f6a2;栈的定义&#x1f6a2;共享栈&#xff08;节省空间&#xff09;&#x1f6a2;栈的表示和实现&#xff08;顺序栈&#xff09;&#x1f47b;顺序栈的定义&…

数据结构:栈和队列(Stack Queue)【详解】

友情链接&#xff1a;数据结构专栏 目录 栈和队列【知识框架】 栈一、栈的基本概念1、栈的定义2、栈的常见基本操作 二、栈的顺序存储结构1、栈的顺序存储2、顺序栈的基本算法&#xff08;1&#xff09;初始化&#xff08;2&#xff09;判栈空&#xff08;3&#xff09;进栈&a…

web 移动端开发基础

web 移动端开发基础 文章目录 web 移动端开发基础了解视口相关内容meta 视口标签掌握二倍图用法物理像素 & 物理像素比多倍图二倍精灵图做法 了解移动端常见选择方案掌握移动端常见问题解决方案移动端常见的布局方式流式布局&#xff08;百分比布局&#xff09;flex 布局 -…

Web移动端

1.PC端和移动端的区别: PC端:屏幕大 用网页固定版心,要考虑浏览器兼容问题,(布局:浮动&#xff0b;定位&#xff0b;标准流) 移动端: 手机屏幕小&#xff0c;网页宽度多数为100%&#xff0c;是适配手机屏幕宽度 移动端则基本不需要考虑兼容性问题&#xff0c;放心大胆使用CS…

移动端网页开发基础

文章目录 前言一、浏览器1.pc端常见浏览器2.移动端常见浏览器 二、视口1.布局视口layout viewport2.视觉视口visual viewport3.理想视口ideal viewport 三、二倍图1.物理像素和物理像素比2.二倍图用法 四、移动端开发选择1.单独制作移动端页面2.响应式兼容pc移动端3.移动端常见…

20.【移动端Web开发之响应式布局】

文章目录 【移动端Web开发之响应式布局】前端小抄(20)一、响应式开发1.1 响应式开发原理1.2 响应式布局容器 二、Bootstrap前端开发框架2.1 Bootstrap简介2.2 Bootstrap使用2.3 布局容器 三、Bootstrap栅格系统3.1 栅格系统简介3.2 栅格选项参数3.3 列嵌套3.4 列偏移3.5 列排序…

H5移动web开发

目录 1、H5 的新特性有哪些&#xff1f;C3 的新特性有哪些&#xff1f; 2、如何使一个盒子水平垂直居中&#xff1f; 方法一&#xff1a;利用定位&#xff08;常用方法,推荐&#xff09; 方法二&#xff1a;利用 margin:auto 方法三&#xff1a;利用 display:table-cell 方法四…

手摸手带你学移动端WEB开发

HTML常用标签总结手摸手带你学CSSHTML5与CSS3知识点总结 好好学习&#xff0c;天天向上 本文已收录至我的Github仓库DayDayUP&#xff1a;github.com/RobodLee/DayDayUP&#xff0c;欢迎Star ⭐⭐⭐⭐⭐转载请注明出处&#xff01;⭐⭐⭐⭐⭐ 链接&#xff1a;https://blog.c…

移动端网页开发(一)

一、项目代码初始化 1.打开index.html将<meta></meta>标签补充完整 <html><head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width,initial-scale1.0&#xff0c;minimum-scale1.0,maximum-…

web移动开发

web移动开发 手机内置浏览器&#xff1a; Android&#xff1a;Andriod BrowserIOS&#xff1a;Mobile SafariBlackBerry&#xff1a;WebkitSymbian S60&#xff1a; Web Browser for S60 其浏览器的核心都是基于Webkit 智能手机Web浏览器的特点: 有限的屏幕尺寸触屏、缩放硬…

移动端页面开发

移动端页面开发需要掌握的…… 移动端开发指的是&#xff1a;需要适配移动设备的网页开发移动开发与pc端开发没有本质的区别&#xff0c;使用的也还是HTML/CSS/JS的技术 一、移动端与pc端开发的区别在于&#xff1a; 1.浏览器不同 手机浏览器是webkit的天下&#xff0c;就目…

从零开始学习移动端Web开发

背景 近年来&#xff0c;随着智能手机的普及&#xff0c;移动端开发受到了异常的关注。从传统的安卓、IOS原生手机系统应用开发&#xff0c;转向了移动端Web开发或者是混合开发&#xff0c;既然有需求&#xff0c;那就让我们一起来学习移动端Web开发吧。本文旨在让读者以最快的…

移动端网站开发

受限于流量太少&#xff0c;以前的手机网站无法做成像现在一样的效果&#xff0c;只能通过超链接的形式实现简单的网页 随着3G&#xff0c;4G&#xff0c;5G的商用&#xff0c;我们的流量越来越多&#xff0c;网速越来越快。越来越多的应用开始去开发网页版。 移动端仿真 未来…

移动端开发

2022.3.5 学习笔记 目录 四、移动端开发方案 五、 移动端技术解决方案 六、移动端常见布局 移动端开发之流式布局&#xff1a; 一、基础 二、制作京东移动端首页案例 四、移动端开发方案 ①单独制作移动端页面 &#xff08;主流&#xff09; 京东商城手机版 淘宝触屏版…

web前端开发之移动端基础

web前端开发之移动端基础 一、物理像素(px) 定义&#xff1a;虚拟像素&#xff0c;可以理解为“直觉”像素&#xff0c;CSS和JS使用的抽象单位&#xff0c;浏览器内的一切长度都是以CSS像素为单位的&#xff0c;CSS像素的单位是px。 1.2 像素到底是什么 像素&#xff08;px…

前端移动端web开发(一)

一、前端开发 1.前端开发分类&#xff1a; PC端开发&#xff1a;页面主要运行在PC端浏览器中 移动端开发&#xff1a;页面主要运行在手机上 移动web开发 在移动端表现良好的页面&#xff0c;如新浪网 混合式开发&#xff08;Hybrid App&#xff09; 也叫“套壳开发”&#xf…

移动端Web开发 基础知识

文章目录 移动端Web开发移动端基础浏览器视口样式编写分辨率和设备像素比二倍图SVG矢量图 移动端Web开发 移动Web开发的两种主流方案&#xff0c;一种是单独制作移动端页面&#xff0c;另一种是制作响应式页面 移动端页面&#xff1a; 单独制作移动端页面的优势和劣势&#…

(一)移动端 Web 开发基础

文章目录 一、移动 Web 开发基础概念1. 像素(1) 分辨率(2) 物理像素(3) CSS 像素(4) 设备像素比(5) 标清屏和高清屏(6) 缩放(7) PPI / DPI 2. 视口 viewport 二、移动 Web 开发基础知识1. box-sizing2. 图标字体3. flex 布局(1) 什么是 flex 布局(2) flex 布局的基本概念(3) fl…

移动端web开发

相关阅读&#xff1a; WebApp与Native App的区别&#xff1f; 在高端智能手机系统中有两种应用程序&#xff1a;一种是基于本地(操作系统)运行的APP;一种是基于高端机的浏览器运行的WebApp&#xff08;基于WEB形式的应用程序&#xff09; Native App&#xff1a; 1、开发成本非…

Web前端开发 移动端开发(快速入门)

目录 一、理论知识1.视口2.物理像素和物理像素比3.二倍图4.移动端开发选择 二、移动端开发流程1.技术选型2.搭建文件结构3.SEO优化3大标签4.设置favicon.ico(logo图片)5.视口标签和初始化样式6.设置自适应尺寸&#xff08;两种方法&#xff09;1.方法一&#xff1a;创建common.…