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

//Q是一个队列,S是一个空栈,实现将队列中的元素逆置的算法。

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#define Size 6
typedef struct SqNode//队列结点
{
int data;
struct SqNode* next;
}LinkNode;
typedef struct SqQueue//队列
{
LinkNode* front, * rear; //头指针和尾指针
}LinkQueue;
typedef struct LinkStack//栈
{
int data;
struct LinkStack* next;
}LinkStack;
void InitQueue(LinkQueue* Q)//假设用带头结点的链表来表示队列
{
Q->front = Q->rear = (LinkNode*)malloc(sizeof(LinkNode));
if (Q->front == NULL)//分配失败
return;
Q->rear->next = NULL;
return;
}
void InitStack(LinkStack** S)//用不带头结点的链表来表示栈,&S表示当前是指向链表指针的指针,所以要用形参要用二级指针
{
*S = NULL;
return;
}
bool EnQueue(LinkQueue* Q, int x)//入队
{
//无需判断满队
LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
if (s == NULL)//分配失败
return false;
s->data = x;
s->next = NULL;
Q->rear->next = s;
Q->rear = s;
return true;
}
bool Push(LinkStack** S, int x)//进栈
{
//无需判断是否满栈
//第一次入栈
if ((*S) == NULL)
{
LinkStack* p = (LinkStack*)malloc(sizeof(LinkStack));
if (p == NULL)//分配失败
return false;
p->data = x;
p->next = NULL;
(*S) = p;
}
//后续入栈
else 
{
LinkStack* q = (LinkStack*)malloc(sizeof(LinkStack));
if (q == NULL)//分配失败
return false;
q->data = x;
q->next = (*S);
(*S) = q;
}
return true;
}
int* DeQueue(LinkQueue* Q, int* x)//出队
{
if (Q->front == Q->rear)//空队
return NULL;
LinkNode* p = Q->front->next;
if (p == Q->rear)//恰好有一个元素
{
*x = p->data;
Q->front->next = NULL;
free(p);
Q->rear = Q->front;
return x;
}
*x = p->data;
Q->front->next = p->next;
free(p);
return x;
}
bool PrintList(LinkQueue Q)//打印队列
{
LinkNode* p = Q.front->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return true;
}
bool PrintStack(LinkStack* S)//打印栈
{
LinkStack* p = S;
if (p == NULL)//空栈
return false;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return true;
}
int main()
{
int arr[Size] = { 1,2,3,4,5,6 };//假设要输入1,2,3,4,5,6
LinkQueue Q;//定义一个队列
LinkStack* S;//定义一个栈
InitQueue(&Q);//初始化队列
InitStack(&S);//初始化栈

    int i;
for(i = 0;i < Size;i++)
EnQueue(&Q,arr[i]);//入队

    int* j;
for (i = 0; i < Size; i++)
{
j = DeQueue(&Q, &arr[i]);//出队
Push(&S, *j);//进栈
}

    //PrintList(Q);//队列打印测试
PrintStack(S);//栈打印测试
return 0;
}

http://www.dtcms.com/a/356355.html

相关文章:

  • 从零开始学习单片机17
  • 医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(五)
  • AR智能眼镜:能源行业运维的数字化革新
  • iOS 文件管理与 uni-app 性能优化实战 多工具协作的完整指南
  • Frida-dexdump 使用指南:从内存中脱取安卓 Dex 文件
  • Go对接全球期货数据源指南:基于StockTV API实现多品种实时监控
  • LeetCode第二题知识点2 ---- 栈、堆、地址
  • 不止 ChatGPT:多模态 AI(文本 + 图像 + 音频)正重构内容创作全流程
  • 数据质检之springboot通过yarn调用spark作业实现数据质量检测
  • 第三章 Vue3 + Three.js 实战:用 OrbitControls 实现相机交互与 3D 立方体展示
  • Unity学习----【数据持久化】二进制存储(一)
  • ExcelJS实现导入转换HTML展示(附源码可直接使用)
  • Excel数组学习笔记
  • 在Excel和WPS表格中隔一行插入多个空白行
  • 网络编程 04:TCP连接,客户端与服务器的区别,实现 TCP 聊天及文件上传,Tomcat 的简单使用
  • 从零开始部署 Kubernetes Dashboard:可视化管理你的集群
  • [Linux]学习笔记系列 -- mm/shrinker.c 内核缓存收缩器(Kernel Cache Shrinker) 响应内存压力的回调机制
  • 创意程序之MP3分割工具
  • sqlachemy
  • AI操作系统语言模型设计 之1 基于意识的Face-Gate-Window的共轭路径的思维-认知-情感嵌套模型
  • 【C语言】深入理解指针(2)
  • 龙迅#LT7621GX适用于两路HDMI2.1/DP1.4A转HDMI2.1混切应用,分辨率高达8K60HZ!
  • 第二阶段WinForm-11:自定义控件
  • 嵌入式Linux驱动开发:i.MX6ULL中断处理
  • 深入解析Qt节点编辑器框架:交互逻辑与样式系统(二)
  • C++基础(⑤删除链表中的重复节点(链表 + 遍历))
  • 储能变流器之LLC
  • MySQL数据库精研之旅第十四期:索引的 “潜规则”(上)
  • Unity、Unreal Engine与Godot中纹理元数据管理的比较分析
  • 嵌入式Linux LED驱动开发