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

}

相关推荐
叶小鸡26 分钟前
小鸡玩算法-力扣HOT100-动态规划(上)
算法·leetcode·动态规划
LuminousCPP32 分钟前
数据结构 - 线性表第三篇:基于顺序表实现 C 语言通讯录(基础功能篇)
c语言·数据结构·经验分享·笔记·算法
_日拱一卒37 分钟前
LeetCode:114二叉树展开为链表
java·开发语言·算法
无小道1 小时前
Redis——哈希类型相关指令
redis·算法·哈希算法
凌波粒1 小时前
LeetCode--513.找树左下角的值(二叉树)
java·算法·leetcode
一个不知名程序员www1 小时前
算法学习入门---算法题DAY1
c++·算法
子琦啊1 小时前
构造函数、this指向和原型链机制
javascript·算法·贴图
WHS-_-20221 小时前
Millimeter Wave ISAC-SLAM: Framework and RFSoC Prototype
人工智能·算法·原型模式
吃好睡好便好1 小时前
在Matlab中绘制杆状图
开发语言·学习·算法·matlab·信息可视化
带带弟弟学爬虫__1 小时前
dyAPP数据采集-个人主页、发布、搜索、评论
服务器·python·算法·flutter·java-ee·django