博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何使用两个堆栈实现队列_使用两个队列实现堆栈
阅读量:2532 次
发布时间:2019-05-11

本文共 3776 字,大约阅读时间需要 12 分钟。

如何使用两个堆栈实现队列

Stack and Queue at a glance...

堆叠和排队一目了然...

Stack:

堆栈:

The stack is an ordered list where insertion and deletion are done from the same end, top. The last element that entered first is the first one to be deleted (the basic principle behind the LIFO). That means it is a data structure which is implemented as LIFO.

堆栈是一个有序列表,其中插入和删除从同一末端开始。 首先输入的最后一个元素是要删除的第一个元素(LIFO的基本原理)。 这意味着它是一个实现为LIFO的数据结构。

The main stack operations are (basic ADT operations)...

主堆栈操作为(基本ADT操作)...

  1. push (int data): Insertion at top

    push(int数据):在顶部插入

  2. int pop(): Deletion from top

    int pop():从顶部删除

Queue:

队列:

The queue is an ordered list in which insertions are done at one end (rear) and deletions are done from another end (front). The first element that got inserted is the first one to be deleted (basic principle of FIFO). That means it is a data structure which is implemented as FIFO.

队列是一个有序列表,其中插入是在一端(后部)完成,而删除是从另一端(前部)完成。 插入的第一个元素是要删除的第一个元素(FIFO的基本原理)。 这意味着它是一个实现为FIFO的数据结构。

The main Queue operations are (basic ADT operations)...

主要的Queue操作是(基本ADT操作)...

  1. EnQueue (int data): Insertion at rear end

    EnQueue(int数据):在后端插入

  2. int DeQueue(): Deletion from front end

    int DeQueue():从前端删除

使用两个队列实现堆栈 (Implementation of a stack using two queues)

Likewise, a queue can be implemented with two stacks, a stack can also be implemented using two queues. The basic idea is to perform stack ADT operations using the two queues.

同样,一个队列可以用两个堆栈实现,一个堆栈也可以用两个队列实现。 基本思想是使用两个队列执行堆栈ADT操作。

So, we need to implement push(),pop() using DeQueue(), EnQueue() operations available for the queues.

因此,我们需要使用队列可用的DeQueue()和EnQueue()操作来实现push(),pop()。

Implementation:

实现方式:

Let q1 and q2 be the two queues...

设q1和q2为两个队列...

struct stack{
struct queue *q1; struct queue *q2;}

Algorithm to implement push and pop:

实现推送和弹出的算法:

Push operation algorithm:

推送操作算法:

  1. Check whether q1 is empty or not. If q1 is empty then EnQueue the element to q2.

    检查q1是否为空。 如果q1为空,则将元素排队到q2。

  2. Otherwise EnQueue to q1.

    否则,排队到q1。

push(struct stack *s,int data){
if(isempty(s->q1)) EnQueue(s->q2,data); else EnQueue(s->q1,data);}

Pop operation algorithm

弹出操作算法

The basic idea is to transfer n-1 elements (let n be the total no of elements) to other queue and delete the last one from a queue to perform the pop operation.

基本思想是将n-1个元素(使n为元素总数)转移到其他队列,并从队列中删除最后一个元素以执行弹出操作。

  1. If q1 is not empty then transfer n-1 elements from q1 to q2 and DeQueue the last element and return it.

    如果q1不为空,则将n-1个元素从q1传输到q2,并对最后一个元素进行DeQueue并返回。

  2. If q2 is not empty then transfer n-1 elements from q2 to q1 and DeQueue the last element and return it.

    如果q2不为空,则将n-1个元素从q2传输到q1,并对最后一个元素进行DeQueue并返回。

int pop(struct stack *s){
int count,size; if(isempty(s->q2)){
size=Size(s->q1); count=0; while(count
q2,DeQueue(s->q1)); count++; } //last element to be popped return DeQueue(s->q1); } else{
size=Size(s->q2); count=0; while(count
q1,DeQueue(s->q2)); count++; } return DeQueue(s->q1); }}

Time complexity analysis:

时间复杂度分析:

  1. Push: O(1)

    推:O(1)

  2. Pop: O(n) , since transferring n-1 elements

    弹出:O(n),因为传输了n-1个元素

使用C ++的实现代码(使用STL) (Implementation code using C++ (using STL))

#include 
using namespace std;struct Stack{
queue
q1,q2; void push(int x){
if(q1.empty()){
q2.push(x); //EnQueue operation using STL } else{
q1.push(x); //EnQueue operation using STL } } int pop(){
int count,size,item; if(q2.empty()){
size=q1.size(); //size=no of elements; count=0; while(count
>x; while(x){
s.push(x); cin>>x; count++; } cout<<"now popping......."<

Output

输出量

implementing stack with two queuesenter any integer to push and 0 to stop pushing1230now popping.......321executed successfully!!!

翻译自:

如何使用两个堆栈实现队列

转载地址:http://wfazd.baihongyu.com/

你可能感兴趣的文章
优雅的程序员
查看>>
oracle之三 自动任务调度
查看>>
Android dex分包方案
查看>>
ThreadLocal为什么要用WeakReference
查看>>
删除本地文件
查看>>
FOC实现概述
查看>>
base64编码的图片字节流存入html页面中的显示
查看>>
这个大学时代的博客不在维护了,请移步到我的新博客
查看>>
GUI学习之二十一——QSlider、QScroll、QDial学习总结
查看>>
nginx反向代理docker registry报”blob upload unknown"解决办法
查看>>
gethostbyname与sockaddr_in的完美组合
查看>>
kibana的query string syntax 笔记
查看>>
旋转变换(一)旋转矩阵
查看>>
thinkphp3.2.3 bug集锦
查看>>
[BZOJ 4010] 菜肴制作
查看>>
C# 创建 读取 更新 XML文件
查看>>
KD树
查看>>
VsVim - Shortcut Key (快捷键)
查看>>
C++练习 | 模板与泛式编程练习(1)
查看>>
HDU5447 Good Numbers
查看>>