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

}

相关推荐
Wect3 小时前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP14 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱1 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub1 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
NAGNIP2 天前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试
NAGNIP2 天前
一文搞懂激活函数!
算法·面试