• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            兩個棧實現一個隊列 和 兩個隊列實現一個棧

               兩個棧實現一個隊列
               要求:只能使用棧的pop和push,以及測試棧是否為空三個操作。
               實現思路:
                  隊列里面使用stack one 和 stack two。
                  進隊列時,直接進入棧one即可。
                  出隊列時,從two彈出一個元素,如果two里面的元素為空,則將one里面的元素依次彈出并壓入two中,再從two彈出一個元素返回。
               
               用STL里面的stack模擬實現queue的代碼如下:
               1 #include <stdio.h>
              2 #include <stdlib.h>
              3 #include <time.h>
              4 #include <stack>
              5 using std::stack;
              6 
              7 template<class T> class CQueue
              8 {
              9 public:
             10     CQueue()
             11     {
             12         nSize = 0;
             13     }
             14     
             15     void clear()
             16     {
             17         while (!one.empty())
             18         {
             19             one.pop();
             20         }
             21         while (!two.empty())
             22         {
             23             two.pop();
             24         }
             25     }
             26 
             27     void push(const T& t)
             28     {
             29         one.push(t);
             30         ++nSize;
             31     }
             32 
             33     void pop()
             34     {
             35         if (two.empty())
             36         {
             37             while (!one.empty())
             38             {
             39                 two.push(one.top());
             40                 one.pop();
             41             }
             42         }
             43         two.pop();
             44         --nSize;
             45     }
             46     
             47     T& front()
             48     {
             49         if (two.empty())
             50         {
             51             while (!one.empty())
             52             {
             53                 two.push(one.top());
             54                 one.pop();
             55             }
             56         }
             57         return two.top();
             58     }
             59     
             60     T& back()
             61     {
             62         return one.top();
             63     }
             64     
             65     bool empty()
             66     {
             67         return nSize == 0;
             68     }
             69     
             70 private:
             71     stack<T> one;
             72     stack<T> two;
             73     int nSize;
             74 };
             75 
             76 #define MAX 20
             77 
             78 int main()
             79 {
             80     CQueue<int> q;
             81     
             82     srand(time(NULL));
             83     for (int i = 0; i < MAX; ++i)
             84     {
             85         q.push(i);
             86         
             87         if (rand() % 2)
             88         {
             89             printf("front: %d\n", q.front());
             90             q.pop();
             91         }
             92     }
             93     
             94     while (!q.empty())
             95     {
             96         printf("front: %d\n", q.front());
             97         q.pop();
             98     }
             99     
            100     return 0;
            101 }
            102 
               
            兩個隊列實現一個棧
               要求:只能使用從隊列的尾部入和頭部出,以及測試隊列是否為空三個操作。
               實現思路:
                  隊列里面使用queue one 和 stack two。
                  進棧時,根據當前元素是全部存儲在哪個隊列而選擇從one或者two的尾部進入。
                  出棧時,假設當前元素都存儲在one里面,則不斷出隊列,直到隊列為空之前的所有元素一次進入隊列two,而one里面的最后一個元素
                  作為棧彈出的值返回。
                  對于當前元素是存儲在哪個隊列里面,可以設置變量標記,初始化時候存儲在one里面,操作一次,由于元素要倒轉,則存儲位置會變
                  一次。
                  
                  用STL里面的queue模擬實現的stack代碼如下:
               1 #include <stdio.h>
              2 #include <queue>
              3 using std::queue;
              4 
              5 template<class T> class CStack
              6 {
              7 public:
              8     CStack()
              9     {
             10         nSize = 0;
             11         nTime = 1;
             12     }
             13 
             14     void clear()
             15     {
             16         while (!one.empty())
             17         {
             18             one.pop();
             19         }
             20         while (!two.empty())
             21         {
             22             two.pop();
             23         }
             24     }
             25 
             26     void push(const T& t)
             27     {
             28         if (nTime % 2)
             29         {
             30             one.push(t);
             31         }
             32         else
             33         {
             34             two.push(t);
             35         }
             36         ++nSize;
             37     }
             38 
             39     void pop()
             40     {
             41         if (nTime % 2)
             42         {
             43             while (!one.empty())
             44             {
             45                 T t = one.front();
             46                 one.pop();
             47                 if (!one.empty())
             48                 {
             49                     two.push(t);
             50                 }
             51             }
             52         }
             53         else
             54         {
             55             while (!two.empty())
             56             {
             57                 T t = two.front();
             58                 two.pop();
             59                 if (!two.empty())
             60                 {
             61                     one.push(t);
             62                 }
             63             }
             64         }
             65 
             66         nTime = (nTime + 1) % 2;
             67         --nSize;
             68     }
             69 
             70     T& top()
             71     {
             72         if (nTime % 2)
             73         {
             74             while (!one.empty())
             75             {
             76                 T t = one.front();
             77                 one.pop();
             78                 if (!one.empty())
             79                 {
             80                     two.push(t);
             81                 }
             82                 else
             83                 {
             84                     two.push(t);
             85                     nTime = (nTime + 1) % 2;
             86                     return two.back();
             87                 }
             88             }
             89         }
             90         else
             91         {
             92             while (!two.empty())
             93             {
             94                 T t = two.front();
             95                 two.pop();
             96                 if (!two.empty())
             97                 {
             98                     one.push(t);
             99                 }
            100                 else
            101                 {
            102                     one.push(t);
            103                     nTime = (nTime + 1) % 2;
            104                     return one.back();
            105                 }
            106             }
            107         }
            108     }
            109 
            110     bool empty()
            111     {
            112         return nSize == 0;
            113     }
            114 
            115 private:
            116     queue<T> one;
            117     queue<T> two;
            118     int nSize;
            119     int nTime;
            120 };
            121 
            122 #define MAX 20
            123 
            124 int main()
            125 {
            126     CStack<int> stack;
            127 
            128     for (int i = 0; i < MAX; ++i)
            129     {
            130         stack.push(i);
            131     }
            132 
            133     while (!stack.empty())
            134     {
            135         printf("top: %d\n", stack.top());
            136         stack.pop();
            137     }
            138     
            139     return 0;
            140 }
            141 

            posted on 2012-03-11 20:30 yx 閱讀(3342) 評論(0)  編輯 收藏 引用 所屬分類: 數據結構

            <2012年3月>
            26272829123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導航

            統計

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學

            網友

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品中文字幕久久| 久久免费视频一区| 久久人人爽人人爽人人片AV不| 国产精品久久久久免费a∨| 久久成人国产精品免费软件| 久久久av波多野一区二区| 成人午夜精品久久久久久久小说 | 久久国产乱子伦免费精品| 久久久久久久综合日本亚洲| 久久精品国产福利国产琪琪| 精品无码久久久久久午夜| 久久久久久国产精品无码下载| 一本色道久久综合亚洲精品| 狠狠久久综合伊人不卡| 久久久久人妻一区精品性色av| 国产激情久久久久影院小草| 精品国产乱码久久久久久郑州公司| 久久久久久极精品久久久| 国产精品久久久天天影视| 97久久国产综合精品女不卡| 久久国产精品免费一区| 久久这里只精品国产99热| 久久香综合精品久久伊人| 精品久久亚洲中文无码| 欧美激情精品久久久久久久九九九 | 1000部精品久久久久久久久| 欧美亚洲国产精品久久| 久久久精品日本一区二区三区 | 久久精品无码一区二区日韩AV| 狠狠色丁香久久婷婷综合五月| 亚洲香蕉网久久综合影视 | 欧美日韩久久中文字幕| 亚洲欧美精品一区久久中文字幕| 狠狠精品干练久久久无码中文字幕 | 伊人久久大香线蕉综合影院首页 | 久久久久久久国产免费看| 日本精品久久久中文字幕| 91秦先生久久久久久久| 国产成人无码精品久久久久免费| 久久99国产精品久久99果冻传媒| 国产情侣久久久久aⅴ免费|