双栈实现队列—c语言

该代码实现了一个使用两个栈来模拟队列操作的结构。包括初始化栈、入队(通过PushS函数向S1栈添加元素)、出队(将S1栈元素转移到S2栈,然后从S2栈弹出元素)、判断队列满和空的功能。在主函数中展示了如何使用这些操作。
摘要由CSDN通过智能技术生成
#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");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值