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

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

- 栈的特点

  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

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用C语言实现两个实现一个队列的程序: ```c #include <stdio.h> #include <stdlib.h> typedef struct stack { int top; int capacity; int* array; } Stack; typedef struct queue { Stack* stack1; Stack* stack2; } Queue; Stack* createStack(int capacity) { Stack* stack = (Stack*)malloc(sizeof(Stack)); stack->capacity = capacity; stack->top = -1; stack->array = (int*)malloc(stack->capacity * sizeof(int)); return stack; } int isStackEmpty(Stack* stack) { return stack->top == -1; } int isStackFull(Stack* stack) { return stack->top == stack->capacity - 1; } void push(Stack* stack, int item) { if (isStackFull(stack)) { printf("Stack is full.\n"); return; } stack->array[++stack->top] = item; } int pop(Stack* stack) { if (isStackEmpty(stack)) { printf("Stack is empty.\n"); return -1; } return stack->array[stack->top--]; } void enqueue(Queue* queue, int item) { push(queue->stack1, item); } int dequeue(Queue* queue) { if (isStackEmpty(queue->stack1) && isStackEmpty(queue->stack2)) { printf("Queue is empty.\n"); return -1; } if (isStackEmpty(queue->stack2)) { while (!isStackEmpty(queue->stack1)) { int item = pop(queue->stack1); push(queue->stack2, item); } } return pop(queue->stack2); } int main() { Queue* queue = (Queue*)malloc(sizeof(Queue)); queue->stack1 = createStack(100); queue->stack2 = createStack(100); enqueue(queue, 1); enqueue(queue, 2); enqueue(queue, 3); printf("%d dequeued from queue.\n", dequeue(queue)); printf("%d dequeued from queue.\n", dequeue(queue)); printf("%d dequeued from queue.\n", dequeue(queue)); free(queue->stack1->array); free(queue->stack1); free(queue->stack2->array); free(queue->stack2); free(queue); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值