程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 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.2cto.com         while(queue1.size() > 1)           {               queue2.push(queue1.front());               queue1.pop();           }                      if (!queue1.empty())           {               queue1.pop();           }       }   }      

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved