C++ 數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列
C++ 數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列
棧為后進(jìn)先出,隊(duì)列為先進(jìn)先出
用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列。是一個(gè)比較經(jīng)典的問題。
看到這個(gè)問題,我的第一個(gè)解題思路為:
定義兩個(gè)棧,s1,s2。s1作為入隊(duì)列棧,s2作為出隊(duì)列棧;
入隊(duì)列:每次入隊(duì)列的時(shí)候,將數(shù)值壓入s1棧中;
出隊(duì)列:出隊(duì)列時(shí),將s1中的所有數(shù)據(jù),壓進(jìn)s2棧中,然后刪除s2的棧頂數(shù)據(jù),然后再將s2中的剩余數(shù)據(jù)壓入s1中。
在這其中s1是一個(gè)存儲空間,s2是一個(gè)輔助空間。
進(jìn)一步想一下上述辦法,在出隊(duì)列時(shí),每一次都要將s1倒進(jìn)s2,然后刪除s2棧頂后又將s2的數(shù)據(jù)倒入s1;有另一個(gè)思路可以減少倒的次數(shù);
入隊(duì)列時(shí):將數(shù)據(jù)壓進(jìn)s1;
出隊(duì)列時(shí):判斷如果s2為空,那么將s1中的數(shù)據(jù),壓進(jìn)s2中,然后刪除s2棧頂,如果s2不為空那么再刪除s2的棧頂即可;
并且還可以優(yōu)化,優(yōu)化如下:
出隊(duì)列時(shí),判斷如果s2為空,那么將s1中n-1個(gè)數(shù)據(jù),壓進(jìn)s2中,然后刪除s1中的棧頂,如果s2不為空那么直接刪除s2的棧頂即可;
優(yōu)化版的c++實(shí)現(xiàn)如下:
#include<iostream> 
using namespace std; 
#include<stack> 
//棧 后進(jìn)先出 隊(duì)列 先進(jìn)先出 
template<class T> 
class Queue 
{ 
public: 
 
  /*T Pop_back() 
  { 
    if (s2.size() <= 0) 
    { 
      while(s1.size() > 0) 
      { 
        T& temp = s1.top(); 
        s1.pop(); 
        s2.push(temp); 
      } 
    } 
    if (s2.size() == 0) 
      throw new exception("queue is empty "); 
 
    T tep = s2.top(); 
    s2.pop(); 
    return tep; 
  }*/ 
 
  T Pop_back() //比上面少一次出棧 
  { 
    if (s2.size() <= 0) 
    { 
      while (s1.size() > 1) 
      { 
        T& temp = s1.top(); 
        s1.pop(); 
        s2.push(temp); 
      } 
      T tep = s1.top(); 
      s1.pop(); 
      return tep; 
    } 
    else{ 
      T tep = s2.top(); 
      s2.pop(); 
      return tep; 
    } 
  } 
   
    void Push_back(const T& value) 
  { 
    s1.push(value); 
  } 
 
    bool Empty() 
    { 
      return (s1.empty() && s2.empty()); 
    }       
 
protected: 
  stack<T> s1; 
  stack<T> s2; 
}; 
 
void TextQueue() 
{ 
  Queue<int> q1; 
  q1.Push_back(1); 
  q1.Push_back(2); 
  q1.Push_back(3); 
  q1.Push_back(4); 
 
  cout << q1.Pop_back() << endl; 
  cout << q1.Pop_back() << endl; 
  cout << q1.Pop_back() << endl; 
  cout << q1.Pop_back() << endl; 
} 
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
上一篇:C語言 makefile學(xué)習(xí)及實(shí)現(xiàn)實(shí)例
欄 目:C語言
下一篇:淺談c++調(diào)用python鏈接的問題及解決方法
本文標(biāo)題:C++ 數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/1700.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
 - 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問題詳解
 - 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
 - 01-10使用OpenGL實(shí)現(xiàn)3D立體顯示的程序代碼
 - 01-10深入理解C++中常見的關(guān)鍵字含義
 - 01-10求斐波那契(Fibonacci)數(shù)列通項(xiàng)的七種實(shí)現(xiàn)方法
 - 01-10C語言 解決不用+、-、&#215;、&#247;數(shù)字運(yùn)算符做加法
 - 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
 - 01-10c++中inline的用法分析
 - 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
 


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
 - 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
 - 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
 - 04-02c語言用函數(shù)寫分段 用c語言表示分段
 - 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
 - 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
 - 04-02c語言沒有round函數(shù) round c語言
 - 04-02c語言分段函數(shù)怎么求 用c語言求分段
 - 04-02C語言中怎么打出三角函數(shù) c語言中怎
 - 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
 
隨機(jī)閱讀
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
 - 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 - 01-11ajax實(shí)現(xiàn)頁面的局部加載
 - 08-05DEDE織夢data目錄下的sessions文件夾有什
 - 04-02jquery與jsp,用jquery
 - 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
 - 01-10C#中split用法實(shí)例總結(jié)
 - 01-10delphi制作wav文件的方法
 


