利用两个栈模拟队列

/**************************************************
题目:用两个栈模拟队列的基本操作1入队2,出队3判断队空4判断队满
s1做为输入栈的元素,一个个压栈相当于入队 s2作为输出队列的元素, 一个个出栈相当于出队
*************************************************/
#include <iostream>
#include <cstdio>
using namespace std;
const int maxsize = 1000;
typedef struct sqstack {
    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 StackFull(sqstack s) {
    if(s.top == maxsize-1) return true;
    else return false;
}
bool Push(sqstack &s, int x) {
    if(s.top == maxsize-1) return false;
    s.data[++s.top] = x;
    return true;
}
bool Pop(sqstack &s, int &x) {
    if(s.top == -1) return false;
    x = s.data[s.top--];
    return true;
}
bool GetTop(sqstack s, int &x) {
    if(s.top == -1) return false;
    x = s.data[s.top];
    return true;
}

bool Enqueue(sqstack &s1, sqstack  &s2, int x) { // input
    int y;
    if(s1.top == maxsize-1) {          // s1 is full
        if(!StackEmpty(s2)) return false; // and s2 is not  empty.
        else if(StackEmpty(s2)) {          //s2 is empty.
            while(!StackEmpty(s1)) {
                Pop(s1, y);
                Push(s2, y);
            }
            Push(s1, x);
            return true;
        }
    }
    else {
        Push(s1, x);
        return true;
    }
}
bool Dequeue(sqstack &s1, sqstack &s2, int &x) {// output from queue.
    int y;
    if(!StackEmpty(s2)) { // s2 not empty
        Pop(s2, x);
        return true;
    }
    else  {
        if(StackEmpty(s1)) return false; // s1 is empty
        else {
            while(!StackEmpty(s1)){
                Pop(s1, y);
                Push(s2, y);
            }
            Pop(s2, x);
            return true;
        }
    }
}
bool QueueEmpty(sqstack s1, sqstack s2) {
    if(StackEmpty(s1) && StackEmpty(s2))return true;  // queue is empty.
    else return false;
}
bool QueueFull(sqstack s1, sqstack s2){
    if(!StackEmpty(s2) && StackFull(s1)) return true; // queue is full.
    else return false;
}

int main()
{
    sqstack s1, s2;
    int var;
    InitStack(s1); InitStack(s2);
    for(int i = 0; i < 10; i++) {
        Enqueue(s1, s2, i);
    }
    while(!QueueEmpty(s1, s2)) {
        Dequeue(s1, s2, var);
        cout << var << endl;
    }
    return 0;

}

时间: 2024-10-27 13:15:41

利用两个栈模拟队列的相关文章

7 两个栈模拟队列,两个队列模拟栈

利用两个栈模拟队列 stack1,stack2 首先向stack1当中放入数据,如果需要输出数据,从stack2中delete数据,如果stack2为空,就把stack1中数据导入stack2 <span style="font-size:14px;">#include "static.h" #include <iostream> #include <stack> template<typename T> class

【干货】容器适配器实现两个栈模拟队列

用两个栈模拟队列的思想就是"倒水思想",这里我们用自定义类型模拟出线性表,再用线性表做容器实现栈的数据结构,最后用栈来实现队列,代码如下: #include<iostream> #include<string> #include<cassert> struct __TrueType//类型萃取 { bool Get() { return true; } }; struct __FalseType { bool Get() { return false

自定义栈的实现及使用两个栈模拟队列

一,使用单链表实现栈 ①栈需要一个栈顶指针 ②栈的基本操作有出栈和入栈,以及判断栈是否为空 ③单链表中每个结点表示一个栈元素,每个结点有指向下一个结点的指针.因此,在栈内部需要实现一个单链表.代码如下: public class Stack<T extends Comparable<? super T>>{ private class Node{ T ele; Node next; public Node(T ele) { this.ele = ele; } } Node top;

利用两个栈实现队列

方法一: 入队时,将元素压入s1. 出队时,将s1的元素逐个"倒入"(弹出并压入)s2,将s2的顶元素弹出作为出队元素,之后再将s2剩下的元素逐个"倒回"s1. 方法二: 入队时,先判断s1是否为空,如不为空,说明所有元素都在s1,此时将入队元素直接压入s1:如为空,要将s2的元素逐个"倒回"s1,再压入入队元素. 出队时,先判断s2是否为空,如不为空,直接弹出s2的顶元素并出队:如为空,将s1的元素逐个"倒入"s2,把最后一

数据结构复习之用两个栈模拟队列操作

#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define MAXSIZE 100 using namespace std; struct Stack{ int s[MAXSIZE]; int top=0; bool stackOverFlow(){ if(top >= MAXSIZE) return true; return false; } bo

剑指offer系列5---两个栈 模拟队列的操作

[题目]两个栈 模拟队列的入队出队操作 1 package com.exe1.offer; 2 3 /** 4 * [题目 ]:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 5 * 队列的出队:应该是队列的列首先出,即栈底元素先出:思路:先把stack1元素一个个弹至上stack2中,再顺序出stack2中数即为队列的出队顺序. 6 * 入队:先放到栈1中 7 * @author WGS 8 * 9 */ 10 import java.util.Stack

用两个栈模拟实现一个队列

题目:如何用两个栈模拟实现一个队列?  如果这两个堆栈的容量分别是m和n(m>n),你的方法能保证的队列容量是多少?(这里讨论的是顺序栈,如果是链式栈的话完全没有必要考虑空间) 分析:栈的特点是“后进先出(LIFO)”,而队列的特点是“先进先出(FIFO)”.用两个栈模拟实现一个队列的基本思路是:用一个栈作为存储空间,另一个栈作为输出缓冲区,把元素按顺序压入两栈(模拟的队列),并按此顺序出队并输出即可. 如下图,用容量为m的栈作为存储空间,容量为n的栈作为输出缓冲区,一开始先将n个元素压入(pu

web前端面试系列 - 数据结构(两个栈模拟一个队列)

一. 用两个栈模拟一个队列 思路一: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时将数据压人s1 3. 出队时将s1弹出,并压人s2,然后弹出s2中的顶部数据,最后再将剩余数据弹出s2,并压人s1. 思路二: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时,判断s1, 是否为空,如果不为空,则将数据直接压入s1, 如果为空,则将s2中的数据全部倒入s1,在将数据压人s1. 3. 出队时,判断s2, 是否为空,如果不为空,则直接弹出s2

用两个栈模拟无限长队列

思路:设置两个栈,栈1起入队的作用.栈2起出队的作用.入队时,所有元素进栈1,栈满时会通过realloc函数追加存储空间并且保存原来栈1的元素.出队时,先判断栈2是否为空,若为空,则会判断栈1是否为空,栈1为空,则说明队列为空,栈1不为空则将栈1的元素全部出栈并入栈2,栈2满时依然通过realloc追加存储空间,然后栈2元素出栈;若栈2不为空,栈2元素直接出栈 extern void *realloc(void *mem_address, unsigned int newsize);功能:先释放