//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;

}

相关推荐
仟濹3 分钟前
算法打卡 day1 (2026-02-06 周四) | 算法: DFS | 1_卡码网98 可达路径 | 2_力扣797_所有可能的路径
算法·leetcode·深度优先
yang)4 分钟前
欠采样时的相位倒置问题
算法
历程里程碑7 分钟前
Linux20 : IO
linux·c语言·开发语言·数据结构·c++·算法
A尘埃9 分钟前
物流公司配送路径动态优化(Q-Learning算法)
算法
天若有情67310 分钟前
【自研实战】轻量级ASCII字符串加密算法:从设计到落地(防查岗神器版)
网络·c++·算法·安全·数据安全·加密
DeeplyMind20 分钟前
第七章:数据结构大比拼
数据结构·计算机科学·少儿编程·少儿科技读物
元亓亓亓21 分钟前
考研408--数据结构--day8--遍历序列&线索二叉树
数据结构·考研·408·线索二叉树
xiaoxue..27 分钟前
合并两个升序链表 与 合并k个升序链表
java·javascript·数据结构·链表·面试
啊森要自信1 小时前
CANN ops-cv:AI 硬件端视觉算法推理训练的算子性能调优与实战应用详解
人工智能·算法·cann
仟濹1 小时前
算法打卡day2 (2026-02-07 周五) | 算法: DFS | 3_卡码网99_计数孤岛_DFS
算法·深度优先