数据结构:用两个栈实现一个队列

本文探讨了栈和队列的特点,栈遵循后进先出(LIFO)原则,而队列遵循先进先出(FIFO)原则。通过使用两个栈,实现了模拟队列的操作,包括入队(在栈1中进行)和出队(通过将栈1的元素移到栈2,然后从栈2顶部弹出)。具体实现涉及Queue(Stack).h、Queue(Stack).c及测试文件test.c。
摘要由CSDN通过智能技术生成

首先,我们比较一下栈和队列的特点:

- 栈的特点

  1. 只允许在固定的一端(栈顶)进行插入和删除元素操作;
  2. 进行数据插入和删除操作的一端称为栈顶,另一端称为栈底;
  3. 栈中的数据元素遵守后进先出 LIFO(Last In First Out)的原则;
  4. 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶;
  5. 出栈:栈的删除操作叫做出栈,出数据也在栈顶;

- 队列的特点

  1. 只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表;
  2. 队列中的数据元素遵守先进先出 FIFO(First In First Out)的原则;
  3. 入队列:进行插入操作的一端称为队尾;
  4. 出队列:进行删除操作的一端称为队头;

实现

在实现过程中关键就是用出入栈模拟出入队列的过程:

  • 入队列:
    用栈1(以下简称为:s1)一直作为入队列是的存储元素的部分,在入队列的时候栈2(以下简称为:s2)一直为空;
    入队列思路
    在这里插入图片描述
  • 出队列:
    出队列时出的是队列的队头元素,就是最先存进队列的元素。所以,出队列出队列时,先将s1的所有元素pop入s2中,再将s2的栈顶元素pop,此时,出队列基本完成,为了后续可能进行的Push等操作,还需要将s2中的元素pop入s1中,这样,出队列全部完成。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

以下为具体实现

Queue(Stack).h文件

//Queue(Stack).h
#pragma once //保证头文件只被编译一次
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

#define max_size 1000

typedef int Datatypedef;
typedef struct Stack
{
   
	Datatypedef _data[max_size];
	int _sizeStack; //栈中的元素个数
}Stack;  
typedef struct Queue
{
   
	Stack _s1;
	Stack _s2;
	Datatypedef _front; //队头
	Datatypedef _rear;  //队尾
	int _sizeQueue; //队列中的元素个数
}Queue;

void QueueInit(Queue* q); //队列初始化函数
void QueueDestroy(Queue* q); //队列销毁函数
void QueuePush(Queue* q,Datatypedef val); //入队列函数
void QueuePop(Queue* q); //出队列函数
Datatypedef QueueFront(Queue* q); //取队头元素函数
Datatypedef QueueRear(Queue* q); //取队尾元素函数
int QueueSize(Queue* q); //求队列元素个数

Queue(Stack).c文件

//Queue(Stack).c

//1.先将栈的结构实现
//栈的初始化函数
void StackInit(Stack* s)
{
   
	assert(s)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值