当前位置:编程学习 > C/C++ >>

用栈实现队列-用队列实现栈

    栈的特点:FILO(First In Last Out)
                       仅能从栈顶插入,删除元素。 
                        最基本的接口包括push() —— 从栈顶压入元素 ,pop()——从栈顶弹出元素
 
 
     队列的特点:FIFO(First In First Out)
                       仅能从队头删除元素,从队尾插入元素。
                       最基本的接口包括enque()——从队尾插入元素, deque()——从队头删除元素
 
 
1.用两个栈实现队列
思路:
           新入队列的元素压入stack1中,当元素出队列时,若stack2为空,则将stack1的全部元素依次弹出,压入stack2中,这样stack2的栈顶元素即为队头元素。
[cpp]  
template<typename T>  
class MyQueue  
{  
public:  
    T front();  
    T back();  
    void enque(const T& ele);  
    void deque();  
  
private:  
    void move(std::stack<T>& from, std::stack<T>& to);  
  
private:  
    std::stack<T> stack1;  
    std::stack<T> stack2;  
};  
  
template<typename T>  
void MyQueue<T>::move(std::stack<T>& from, std::stack<T>& to)  
{  
    if (to.empty()) {  
        while (!from.empty()) {  
            to.push(from.top());  
            from.pop();  
        }     
    }  
}  
  
template<typename T>  
T MyQueue<T>::front()  
{  
    T ele;  
    move(stack1, stack2);  
    if (!stack2.empty()) {  
        ele = stack2.top();       
    }  
    return ele;  
}  
  
template<typename T>  
T MyQueue<T>::back()  
{  
    T ele;  
    move(stack2, stack1);  
  
    if (!stack1.empty()) {  
        ele = stack1.top();  
    }     
  
    return ele;  
}  
  
template<typename T>  
void MyQueue<T>::enque(const T& ele)  
{  
    stack1.push(ele);  
}  
  
template<typename T>  
void MyQueue<T>::deque()  
{  
    move(stack1, stack2);  
  
    if (!stack2.empty()) {  
        stack2.pop();  
    }  
}  
 
2.用两个队列实现栈
思路:
           新元素入栈时,若两个队列都为空,向任意一个队列队尾插入元素,否则向其中一个非空队列插入元素。栈弹出元素时,将非空队列的元素依次删除,
           插入另一个空队列,只留下队尾元素(此即栈顶元素),弹出栈顶即从队列中删除此元素。
[cpp] 
template<typename T>  
class MyStack  
{  
public:  
    T top();  
    void push(const T& ele);  
    void pop();  
  
private:  
    std::queue<T> queue1;  
    std::queue<T> queue2;  
};  
  
template<typename T>  
T MyStack<T>::top()  
{  
    T ele;  
    if (queue1.empty() && !queue2.empty()) {  
        ele = queue2.back();  
    }  
    else if (!queue1.empty() && queue2.empty()) {  
        ele = queue1.back();  
    }  
  
    return ele;  
}  
  
template<typename T>  
void MyStack<T>::push(const T& ele)  
{  
    if (queue1.empty())  
    {  
        queue2.push(ele);  
    }  
    else if (queue2.empty())  
    {  
        queue1.push(ele);  
    }     
}  
  
template<typename T>  
void MyStack<T>::pop()  
{  
    if (queue1.empty())  
    {  
        while(queue2.size() > 1)  
        {  
            queue1.push(queue2.front());  
            queue2.pop();  
        }  
  
        if (!queue2.empty())  
        {  
            queue2.pop();  
        }  
    }  
    else if (queue2.empty())  
    {  www.zzzyk.com
        while(queue1.size() > 1)  
        {  
            queue2.push(queue1.front());  
            queue1.pop();  
        }  
          
        if (!queue1.empty())  
        {  
            queue1.pop();  
        }  
    }  
}  
 
 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,