用两个栈模拟队列

本文介绍了如何利用两个栈来模拟队列的操作。当进队时,若栈1未满则元素直接进入栈1;若栈1满且栈2不空,队列则满;若栈1满且栈2空,将栈1元素全部转移至栈2后再进队。出队时,若栈2不空则直接出栈;若栈2空但栈1不空,将栈1元素倒入栈2后出栈。
摘要由CSDN通过智能技术生成

title: 用两个栈模拟队列
tags: 数据结构

  版权声明:本文参考了严蔚敏的《 数据结构》。未经作者允许,严禁用于商业出版,否则追究法律责任。网络转载请注明出处,这是对原创者的起码的尊重!!!


1 算法描述

由于队列先进先出,而栈后进先出,用两个栈就可以模拟队列

  • 进队:如果栈1未满则直接进栈;如果栈1满了,栈2不为空,则队列满了;如果栈1满了,栈2为空,则将栈1 中所有元素倒入栈2中,然后元素进栈1
  • 出队: 如果栈2不为空则直接出栈;如果栈2为空,栈1也为空,则队空;如果栈2为空,栈1不为空,则将栈1 中所有元素倒入栈2中,然后栈2出栈。

2 算法实现

#include<iostream>
using namespace std;
#define NULL 0
#define ok 1
#define yes 1
#define no 0
#define error 0
#define false 0
#define maxsize 10
struct stillstack//定义一个静态栈1,栈顶指针指向栈顶元素位置
{
    
	int data[maxsize];
	int top, bottom;
};

int initstack(stillstack &s)//对静态栈的初始化
{
    
	s.top = s.bottom = -1;
	return ok;
}


int push(stillstack &s, int e)//静态栈入栈
{
    
	if (s.top-s.bottom>=maxsize)
		return error;
	else
		s.data[++s.top] = e;
	return ok;
}

int pop(stillstack &s, int &e
可以使用两个模拟队列,具体实现如下: 1. 定义两个 Stack1 和 Stack2,用 Stack1 来存放入队的元素,用 Stack2 来处理出队操作。 2. 入队操作:将元素压入 Stack1。 3. 出队操作:首先判断 Stack2 是否为空,如果不为空,则弹出顶元素;如果为空,将 Stack1 中的元素依次出并压入 Stack2,再弹出顶元素。 下面是用 C 语言实现的代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 // 定义结构体 typedef struct { int data[MAX_SIZE]; int top; } Stack; // 初始化 void initStack(Stack *s) { s->top = -1; } // 判断是否为空 int isStackEmpty(Stack *s) { return s->top == -1; } // 判断是否已满 int isStackFull(Stack *s) { return s->top == MAX_SIZE - 1; } // 入 void push(Stack *s, int value) { if (isStackFull(s)) { printf("Stack overflow!\n"); exit(1); } s->data[++s->top] = value; } // 出 int pop(Stack *s) { if (isStackEmpty(s)) { printf("Stack underflow!\n"); exit(1); } return s->data[s->top--]; } // 定义队列结构体 typedef struct { Stack s1; Stack s2; } Queue; // 初始化队列 void initQueue(Queue *q) { initStack(&q->s1); initStack(&q->s2); } // 入队 void enqueue(Queue *q, int value) { push(&q->s1, value); } // 出队 int dequeue(Queue *q) { int value; if (isStackEmpty(&q->s2)) { while (!isStackEmpty(&q->s1)) { value = pop(&q->s1); push(&q->s2, value); } if (isStackEmpty(&q->s2)) { printf("Queue underflow!\n"); exit(1); } } return pop(&q->s2); } int main() { Queue q; initQueue(&q); enqueue(&q, 10); enqueue(&q, 20); enqueue(&q, 30); printf("%d\n", dequeue(&q)); printf("%d\n", dequeue(&q)); printf("%d\n", dequeue(&q)); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蓝月心语

你的鼓励是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值