栈的实现 与 用两个栈实现队列

栈的实现

/**
 * 栈的实现:数组
 */
class MyStack1<T>{
    private T[] data;
    private int maxLength;
    private int top;

    public MyStack1(int maxLength) {
        this.maxLength = maxLength;
        this.data= (T[])new Object[maxLength];
        top=-1;
    }

    public boolean isFull(){
        if(top==maxLength-1)return true;
        return false;
    }
    public boolean isEmpty(){
        if(top<=-1)return true;
        return false;
    }

    public boolean push(T t){
        if(!isFull()) {data[++top]=t;return true;}
        return false;
    }
    public T pop(){
        if(!isEmpty()){return data[top--];}
        return null;
    }
}

/**
 * 栈的实现:链表(插入到链表头,并从头取)
 */
class MyStack2<T>{
    private Node<T> head;
    private int size;
    private int maxSize;
    private class Node<T>{
        private T data;
        private Node<T> next;

        public Node(T data) {
            this.data = data;
        }
    }

    public MyStack2(int maxSize) {
        this.maxSize = maxSize;
    }

    public boolean isEmpty(){
        if(size<=0)return true;
        return false;
    }
        public boolean isFull(){
        if(size>=maxSize)return true;
        return false;
    }
    public boolean push(T t){
        if(!isFull()){
            Node node = new Node(t);
            node.next=head;
            head=node;
            size++;
        }
        return false;
    }
    public T pop(){
        if(!isEmpty()){
            T data = head.data;
            head=head.next;
            size--;
            return data;
        }
        return null;
    }
}

使用栈实现队列

/**
 *使用栈实现队列的下列操作:
 *
 * push(x) -- 将一个元素放入队列的尾部。
 * pop() -- 从队列首部移除元素。
 * peek() -- 返回队列首部的元素。
 * empty() -- 返回队列是否为空。
 */
class MyQueue {
    private Stack<Integer> stack1;
    private Stack<Integer> stack2;
    /** Initialize your data structure here. */
    public MyQueue() {
        this.stack1 = new Stack();
        this.stack2 = new Stack();
    }

    /** Push element x to the back of queue. */
    public void push(int x) {
        stack1.push(x);
    }

    /** Removes the element from in front of queue and returns that element. */
    public int pop() {
        if(!empty()){
            if(!stack2.empty())return stack2.pop();
            while(!stack1.empty())stack2.push(stack1.pop());
        }
        return stack2.pop();
    }

    /** Get the front element. */
    public int peek() {
        if(!empty()){
            if(!stack2.empty())return stack2.peek();
            while(!stack1.empty())stack2.push(stack1.pop());
        }
        return stack2.peek();
    }

    /** Returns whether the queue is empty. */
    public boolean empty() {
        if(stack1.empty() && stack2.empty())return true;
        return false;
    }
}

原文地址:https://www.cnblogs.com/loveer/p/11757359.html

时间: 2024-11-01 11:30:18

栈的实现 与 用两个栈实现队列的相关文章

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

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

【剑指Offer】05 - 用两个栈实现队列

重建二叉树 时间限制:1秒 空间限制:32768K 本题知识点:队列 栈 题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. import java.util.Stack; public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); publi

一个数组实现两个栈

//1.两个栈栈头在数组头尾(利用率高) //2.两个栈栈头在数组中间(利用率低) //3.奇偶下标分别为两栈(扩容时复制数据简单) //实现1 template<class T> class Stack { public: Stack() :_array(NULL) , _q1Size(0) , _q2Size(0) , _capacity(0) {} ~Stack() { delete[] _array; _q1Size = _q2Size = _capacity = 0; } void 

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型

import java.util.Stack; /**  * 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.  * @author user  *  *思路:队列是先入先出,栈是先入后出,可以将数据压入第一个栈后,在弹出来压入第二个栈,弹得时候直接从第二个栈弹出,弹出后又将  *第二个栈中的所有数据弹出重新压入的一个栈  */ public class Solution {     Stack<Integer> stack1 = new Stack<

《剑指offer》之用两个栈实现队列

题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路:把stack1作为主栈,每次有新元素入队,先把stack1中所有元素pop到stack2中暂存,再push新元素到stack1,最后把stack2中元素pop到stack1. 代码实现: 1 import java.util.Stack; 2 3 public class Solution { 4 Stack<Integer> stack1 = new Stack<Integer&g

使用两个栈实现一个队列

使用两个栈Stack1和Stack2来实现一个队列.其中一个栈作为主存放数据的,另外一个栈作为临时存放数据的栈.具体操作如下: enqueue: 栈Stack1的入栈操作. dequeue:将Stack1中的元素一个一个地全部依次出栈,并且在Stack1出栈的同时把出栈的元素作为参数对Stack2进行入栈操作.这步完成之后,执行Stack2出栈操作,这时就将原先在Stack1中最先入栈的元素弹出.最后再将Stack2中的元素一个一个地全部依次出栈,填到Stack1中. 实现代码如下: /** *

用两个栈创建队列

1.第一种方法: 1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 #include<stack> 4 using namespace std; 5 6 //Pop , push, front, back, empty; 7 template<class T> 8 class MyQueue 9 { 10 public: 11 //判断队列是否为空. empty 12 bool empty() 13 { 1

用两个栈实现队列

题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. template <typename T>class CQueue { public: CQueue(void); ~CQueue(void); void appendtail(const T& node); T deleteHead(); private: stack<T> stack1; stack<T&

用两个栈实现队列-剑指Offer

用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路 一个栈的顺序是“后进先出”,再用一个栈把顺序颠倒过来就满足队列的“先进先出”规则了 用两个stack实现,stack1负责进队列,然后从stack2弹栈出队列,若stack2为空,再从stack1弹出到stack2 代码 import java.util.Stack; public class Solution { Stack<Integer> stack1 = new St