#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
#define MAX 100
struct Sqsack {
int* base;
int* top;
int sizesqsack;
};
void InitS(struct Sqsack* S); //初始化栈
void PushS(struct Sqsack* S, int e); //返回是否栈满
int PopS(struct Sqsack* S); //出栈操作
int SizeS(struct Sqsack S); //求栈长度
int Empty(struct Sqsack S); //判空操作 0表示空,1表示有数据
int Full(struct Sqsack S); //判断栈是否为满 1表示满,0表示不满
struct Queue {
struct Sqsack S1;
struct Sqsack S2;
};
void InitQ(struct Queue* Q); //队初始化
void EnQueue(struct Queue* Q, int e); //入队
void DeQueue(struct Queue* Q); //出队
void EmptyQ(struct Queue Q); //判断队是否为空
void FullQ(struct Queue Q); //判断队是否满
int main()
{
int e = 0;
struct Queue Q;
InitQ(&Q);
EnQueue(&Q, 1);
EnQueue(&Q, 2);
EnQueue(&Q, 3);
FullQ(Q);
EmptyQ(Q);
DeQueue(&Q);
DeQueue(&Q);
DeQueue(&Q);
FullQ(Q);
EmptyQ(Q);
return 0;
// 下面入队出队操作
/*
while (e != -1)
{
printf("请输入入栈S1数据,输入-1表示结束\n");
scanf("%d", &e);
if (e != -1)
{
PushS(&S1, e); //相当于入队操作
count++;
}
}
if (count == S1.sizesqsack)
{
printf("S1栈已满,需要放到S2中");
}
size = SizeS(S1);
//printf("S1栈的长度为 = %d\n", size);
for (i = 1; i <= size; i++)
{
m = PopS(&S1);
// printf("出栈的数据为 = %d\n", m);
PushS(&S2, m);
}
printf("\n");
printf("\n");
size2 = SizeS(S2);
// printf("S2栈的长度为 = %d\n", size2);
for (i = 1; i <= size2; i++)
{
m = PopS(&S2);
printf("出栈的数据为 = %d\n", m); //相当于出队操作
}
// 下面判断队满
if (S1.top - S1.base == S1.sizesqsack && S2.top - S2.base == S2.sizesqsack)
{
printf("队满\n");
}
//下面判断队空
if (S1.base == S1.top && S2.top == S2.base)
{
printf("队空\n");
}
*/
}
void InitS(struct Sqsack* S)
{
S->base = (int*)malloc(MAX * sizeof(int));
if (S->base == NULL)
{
printf("空间开辟失败\n");
}
else
{
S->top = S->base;
S->sizesqsack = MAX;
printf("空间开辟成功\n");
}
}
void PushS(struct Sqsack* S, int e)
{
if (S->top - S->base == S->sizesqsack)
{
printf("栈已满啊\n");
}
else
{
*S->top = e;
S->top++;
// printf("成功加入顺序栈\n");
}
}
int PopS(struct Sqsack* S)
{
int e = 0;
if (S->base == S->top)
{
printf("栈空\n");
exit(0);
}
else
{
S->top--;
e = *S->top;
return e;
}
}
int SizeS(struct Sqsack S)
{
return S.top - S.base;
}
int Empty(struct Sqsack S)
{
if (S.top == S.base)
{
return 0;
}
else
{
return 1;
}
}
int Full(struct Sqsack S)
{
if (S.top - S.base == S.sizesqsack)
{
return 1;
}
else
{
return 0;
}
}
// 下面是队的操作函数
void InitQ(struct Queue* Q)
{
InitS(&Q->S1);
InitS(&Q->S2);
}
void EnQueue(struct Queue* Q, int e)
{
if (Full(Q->S1))
{
printf("队已满\n");
}
else
{
PushS(&Q->S1, e);
}
}
void DeQueue(struct Queue* Q)
{
int e = 0, c = 0;
while (Empty(Q->S1))
{
e = PopS(&Q->S1);
PushS(&Q->S2, e);
}
while (Empty(Q->S2))
{
c = PopS(&Q->S2);
printf("出队数据为 = %d\n", c);
}
}
void EmptyQ(struct Queue Q)
{
if (!Empty(Q.S1) && !Empty(Q.S2))
{
printf("队列为空\n");
}
}
void FullQ(struct Queue Q)
{
if (Full(Q.S1) && Full(Q.S2))
{
printf("队列满\n");
}
}
双栈实现队列—c语言
于 2023-03-27 16:08:55 首次发布
该代码实现了一个使用两个栈来模拟队列操作的结构。包括初始化栈、入队(通过PushS函数向S1栈添加元素)、出队(将S1栈元素转移到S2栈,然后从S2栈弹出元素)、判断队列满和空的功能。在主函数中展示了如何使用这些操作。
摘要由CSDN通过智能技术生成