利用两个栈s1,s2模拟一个队列时,如何用栈的运算来实现该队列的运算?写出模拟队列插入和删除的函数。一个栈s1用于插入元素,另一个栈s2用于删除元素

利用两个栈s1,s2模拟一个队列时,如何用栈的运算来实现该队列的运算?写出模拟队列插入和删除的函数。一个栈s1用于插入元素,另一个栈s2用于删除元素。

前置知识点(栈定义,及出栈入栈函数)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdbool.h>
#define MaxSize 5
typedef struct {
	int data[MaxSize];//栈中元素
	int top;//栈顶指针
}SqStack;

void InitStack(SqStack* S) {//栈初始化
	(*S).top = -1;
}

bool StackEmpty(SqStack* S) {//判空
	if ((*S).top == -1) {//栈中无元素
		return true;
	}
	else {
		return false;
	}
}


bool Pop(SqStack* S, int* x) {//出栈
	if (S->top == -1) {//栈中无元素
		return false;
	}
	*x = S->data[S->top];
	S->top--;
	return true;
}

bool Push(SqStack* S, int x) {//入栈
	if (S->top == MaxSize - 1) {
		return false;
	}
	S->top++;
	S->data[S->top] = x;
	return true;
}

模拟入队:

//模拟入队
int EnQueue(SqStack* s1, SqStack* s2,int x) {
	int tmp = 0;//用于后面出栈带出出栈元素
	if (s1->top==MaxSize-1) {//s1满了
		if (!StackEmpty(s2)) {//s2只有满和空两种状态,这里不空就是满了
			printf("队列已满,入队失败!");
			return 0;
		}
		else {//s2为空,把s1的元素全部赋给它,注意,是全部!
			while (!StackEmpty(s1)) {
				Pop(s1, &tmp);
				Push(s2, tmp);
			}
		}
		Push(s1, x);
	}
	else {//s1没满,直接压进去就行了
		Push(s1, x);
	}
	return 1;
}

模拟出队

//模拟出队
int DeQueue(SqStack* s1, SqStack* s2, int* x) {
	int tmp = 0;//用于后面出栈带出出栈元素
	if (!StackEmpty(s2)) {//s2不空,直接从s2出
		Pop(s2, x);
		return 1;
	}
	else {//s2是空的
		if (StackEmpty(s1)) {//s1也是空的
			printf("队列已空,出队失败");
		}
		else {//s1不空
			//把s1的元素全部移动到s2, 注意,是全部!
			while (!StackEmpty(s1)) {
				Pop(s1, &tmp);
				Push(s2, tmp);
			}
		}
	}
	Pop(s2, x);
	return 1;
}

模拟队列打印函数

void Qprint(SqStack s1,SqStack s2) {//两个栈实现的模拟队列打印
	int tmp = 0;
	while (!StackEmpty(&s2)) {//s2不空
		Pop(&s2, &tmp);
		printf("%d ", tmp);
	}
	while (!StackEmpty(&s1)) {//s1不空,把s1的元素全部移动到s2
		Pop(&s1, &tmp);
		Push(&s2, tmp);
	}
	while (!StackEmpty(&s2)) {//s2又有元素了,重复上面的操作
		Pop(&s2, &tmp);
		printf("%d ", tmp);
	}
}

入队用例测试

int main() {//入队测试
	SqStack s1;//每个栈5个大小,最终的队列最大size为10
	SqStack s2;
	InitStack(&s1);
	InitStack(&s2);
	
	
	int x = 0;
	printf("请输入要入队的元素:");
	while (scanf("%d", &x) != EOF) {
		int tmp=EnQueue(&s1, &s2, x);//看看当前是否成功入队
		if (tmp == 1) {
			printf("当前队列中元素为:");
			Qprint(s1, s2);
			printf("\n");
		}
	}

	printf("\n");


	return 0;
}

在这里插入图片描述

出队用例测试

int main() {//入队测试
	SqStack s1;//每个栈5个大小,最终的队列最大size为10
	SqStack s2;
	InitStack(&s1);
	InitStack(&s2);
	
	//先入队五个
	EnQueue(&s1, &s2, 1);
	EnQueue(&s1, &s2, 2);
	EnQueue(&s1, &s2, 3);
	EnQueue(&s1, &s2, 4);
	EnQueue(&s1, &s2, 5);

	printf("\n");

	//出队测试
	int x = 5;
	int tmp = 0;
	while (x) {
		DeQueue(&s1, &s2, &tmp);
		printf("已移除队首元素%d ", tmp);
		printf("当前队列元素为:");
		Qprint(s1, s2);
		printf("\n");
		x--;
	}

	return 0;
}

在这里插入图片描述

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

劲夫学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值