數據結構(棧--兩個隊列實現)



       當看到用兩個棧實現隊列以後,大家有沒有興趣用兩個隊列實現一個棧呢,呵呵!現在就來介紹用兩個隊列實現一個棧。

      

       如圖

這裏介紹隊列的常用操作:

l 創建棧

l 銷燬棧

l 清空棧

l 壓棧

l 出棧

l 返回棧頂元素

l 返回棧的大小

代碼總分爲三個文件:

QStack.h : 放置功能函數的聲明,以及表的聲明 

QStack.c : 放置功能函數的定義,以及表的定義

Main.c   : 主函數,使用功能函數完成各種需求,一般用作測試

整體結構圖爲:

 

這裏詳細說下壓棧操作,出棧操作和返回棧頂元素操作:

 

壓棧操作:

[cpp] view plain copy


  1. int QStack_Push(QStack* stack, void* item)  
  2. {  
  3.     TQStack* aStack = (TQStack*)stack;  
  4.       
  5.     int ret = (NULL!=aStack) && (NULL!=item);  
  6.       
  7.     if(ret)  
  8.     {  
  9.         if(0 == LinkQueue_Length(aStack->queue_A))  
  10.         {  
  11.             ret = LinkQueue_Append(aStack->queue_B, item);     
  12.         }  
  13.         else  
  14.         {  
  15.             ret = LinkQueue_Append(aStack->queue_A, item);  
  16.         }  
  17.           
  18.     }  
  19.       
  20.     return ret;  
  21. }  


如圖:

  

出棧操作:

[cpp] view plain copy


  1. void* QStack_Pop(QStack* stack)  
  2. {  
  3.     TQStack* aStack = (TQStack*)stack;  
  4.       
  5.     void* ret = NULL;  
  6.       
  7.     if((NULL!=aStack) && (0<QStack_Length(aStack)))  
  8.     {  
  9.         if(0 == LinkQueue_Length(aStack->queue_B))  
  10.         {  
  11.             while(LinkQueue_Length(aStack->queue_A) > 1)  
  12.             {  
  13.                 LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));  
  14.             }  
  15.               
  16.             ret = LinkQueue_Retrieve(aStack->queue_A);  
  17.         }  
  18.         else   
  19.         {  
  20.             while(LinkQueue_Length(aStack->queue_B) > 1)  
  21.             {  
  22.                 LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));  
  23.             }  
  24.               
  25.             ret = LinkQueue_Retrieve(aStack->queue_B);  
  26.         }  
  27.     }  
  28.       
  29.     return ret;  
  30. }  


如圖:

返回棧頂元素:

[cpp] view plain copy


  1. void* QStack_Top(QStack* stack)  
  2. {  
  3.     TQStack* aStack = (TQStack*)stack;  
  4.       
  5.     void* ret = NULL;  
  6.       
  7.     if((NULL!=aStack) && (0<QStack_Length(stack)))  
  8.     {  
  9.         if(0 == LinkQueue_Length(aStack->queue_B))  
  10.         {  
  11.             while(LinkQueue_Length(aStack->queue_A) > 1)  
  12.             {  
  13.                 LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));  
  14.             }  
  15.               
  16.             ret = LinkQueue_Header(aStack->queue_A);  
  17.             LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));  
  18.         }  
  19.         else  
  20.         {  
  21.             while(LinkQueue_Length(aStack->queue_B) > 1)  
  22.             {  
  23.                 LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));  
  24.             }  
  25.               
  26.             ret = LinkQueue_Header(aStack->queue_B);  
  27.             LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));  
  28.         }  
  29.     }  
  30.       
  31.     return ret;  
  32. }  


如圖:

            

OK! 上代碼:

QStack.h : 

[cpp] view plain copy


  1. #ifndef _QSTACK_H_  
  2. #define _QSTACK_H_  
  3.   
  4. typedef void QStack;  
  5.   
  6. QStack* QStack_Create();  
  7.   
  8. void QStack_Destroy(QStack* stack);  
  9.   
  10. void QStack_Clear(QStack* stack);  
  11.   
  12. int QStack_Push(QStack* stack, void* item);  
  13.   
  14. void* QStack_Pop(QStack* stack);  
  15.   
  16. void* QStack_Top(QStack* stack);  
  17.   
  18. int QStack_Length(QStack* stack);  
  19.   
  20. #endif  


 

QStack.c :

 

[cpp] view plain copy


  1. #include <malloc.h>  
  2. #include “LinkQueue.h”  
  3. #include “QStack.h”  
  4.   
  5. typedef struct _tag_QStack  
  6. {  
  7.     LinkQueue* queue_A;  
  8.     LinkQueue* queue_B;  
  9. }TQStack;  
  10.   
  11. QStack* QStack_Create()  
  12. {  
  13.     TQStack* ret = (TQStack*)malloc(sizeof(TQStack));  
  14.       
  15.     if(NULL != ret)  
  16.     {  
  17.         ret->queue_A = LinkQueue_Create();  
  18.         ret->queue_B = LinkQueue_Create();  
  19.           
  20.         if((NULL==ret->queue_A) || (NULL==ret->queue_B))  
  21.         {  
  22.             LinkQueue_Destroy(ret->queue_A);  
  23.             LinkQueue_Destroy(ret->queue_B);  
  24.               
  25.             free(ret);  
  26.             ret = NULL;  
  27.         }  
  28.     }  
  29.       
  30.     return ret;  
  31. }  
  32.   
  33. void QStack_Destroy(QStack* stack)  
  34. {  
  35.     QStack_Clear(stack);  
  36.       
  37.     free(stack);      
  38. }  
  39.   
  40. void QStack_Clear(QStack* stack)  
  41. {  
  42.     while(QStack_Length(stack) > 0)  
  43.     {  
  44.         QStack_Pop(stack);  
  45.     }  
  46. }  
  47.   
  48. int QStack_Push(QStack* stack, void* item)  
  49. {  
  50.     TQStack* aStack = (TQStack*)stack;  
  51.       
  52.     int ret = (NULL!=aStack) && (NULL!=item);  
  53.       
  54.     if(ret)  
  55.     {  
  56.         if(0 == LinkQueue_Length(aStack->queue_A))  
  57.         {  
  58.             ret = LinkQueue_Append(aStack->queue_B, item);     
  59.         }  
  60.         else  
  61.         {  
  62.             ret = LinkQueue_Append(aStack->queue_A, item);  
  63.         }  
  64.           
  65.     }  
  66.       
  67.     return ret;  
  68. }  
  69.   
  70. void* QStack_Pop(QStack* stack)  
  71. {  
  72.     TQStack* aStack = (TQStack*)stack;  
  73.       
  74.     void* ret = NULL;  
  75.       
  76.     if((NULL!=aStack) && (0<QStack_Length(aStack)))  
  77.     {  
  78.         if(0 == LinkQueue_Length(aStack->queue_B))  
  79.         {  
  80.             while(LinkQueue_Length(aStack->queue_A) > 1)  
  81.             {  
  82.                 LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));  
  83.             }  
  84.               
  85.             ret = LinkQueue_Retrieve(aStack->queue_A);  
  86.         }  
  87.         else   
  88.         {  
  89.             while(LinkQueue_Length(aStack->queue_B) > 1)  
  90.             {  
  91.                 LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));  
  92.             }  
  93.               
  94.             ret = LinkQueue_Retrieve(aStack->queue_B);  
  95.         }  
  96.     }  
  97.       
  98.     return ret;  
  99. }  
  100.   
  101. void* QStack_Top(QStack* stack)  
  102. {  
  103.     TQStack* aStack = (TQStack*)stack;  
  104.       
  105.     void* ret = NULL;  
  106.       
  107.     if((NULL!=aStack) && (0<QStack_Length(stack)))  
  108.     {  
  109.         if(0 == LinkQueue_Length(aStack->queue_B))  
  110.         {  
  111.             while(LinkQueue_Length(aStack->queue_A) > 1)  
  112.             {  
  113.                 LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));  
  114.             }  
  115.               
  116.             ret = LinkQueue_Header(aStack->queue_A);  
  117.             LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));  
  118.         }  
  119.         else  
  120.         {  
  121.             while(LinkQueue_Length(aStack->queue_B) > 1)  
  122.             {  
  123.                 LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));  
  124.             }  
  125.               
  126.             ret = LinkQueue_Header(aStack->queue_B);  
  127.             LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));  
  128.         }  
  129.     }  
  130.       
  131.     return ret;  
  132. }  
  133.   
  134. int QStack_Length(QStack* stack)  
  135. {  
  136.     TQStack* aStack = (TQStack*)stack;  
  137.       
  138.     int ret = -1;  
  139.       
  140.     if(NULL != aStack)  
  141.     {  
  142.         ret = LinkQueue_Length(aStack->queue_B) +  
  143.               LinkQueue_Length(aStack->queue_A);  
  144.     }  
  145.       
  146.     return ret;  
  147. }  


 

Main.c     :

            

[cpp] view plain copy


  1. #include <stdio.h>  
  2. #include “QStack.h”  
  3.   
  4. int main(void)  
  5. {  
  6.     QStack* stack = QStack_Create();  
  7.       
  8.     int a[10];  
  9.     int i = 0;  
  10.   
  11.     for(i=0; i<10; i++)  
  12.     {  
  13.         a[i] = i;  
  14.           
  15.         QStack_Push(stack, a+i);  
  16.     }  
  17.       
  18.     printf(”Header:   %d\n”, *(int*)QStack_Top(stack));  
  19.     printf(”Length:   %d\n\n”, QStack_Length(stack));  
  20.       
  21.     while(QStack_Length(stack) > 0)  
  22.     {  
  23.         printf(”Pop:  %d\n”, *(int*)QStack_Pop(stack));  
  24.     }  
  25.     printf(”\n”);  
  26.       
  27.     for(i=0; i<6; i++)  
  28.     {  
  29.         a[i] = i+10;  
  30.           
  31.         QStack_Push(stack, a+i);  
  32.     }  
  33.       
  34.     while(QStack_Length(stack) > 0)  
  35.     {  
  36.         printf(”Pop:  %d\n”, *(int*)QStack_Pop(stack));  
  37.     }  
  38.       
  39.     QStack_Destroy(stack);  
  40.       
  41.     return 0;  
  42. }  

       當看到用兩個棧實現隊列以後,大家有沒有興趣用兩個隊列實現一個棧呢,呵呵!現在就來介紹用兩個隊列實現一個棧。

      

       如圖

這裏介紹隊列的常用操作:

l 創建棧

l 銷燬棧

l 清空棧

l 壓棧

l 出棧

l 返回棧頂元素

l 返回棧的大小

代碼總分爲三個文件:

QStack.h : 放置功能函數的聲明,以及表的聲明 

QStack.c : 放置功能函數的定義,以及表的定義

Main.c   : 主函數,使用功能函數完成各種需求,一般用作測試

整體結構圖爲:

 

這裏詳細說下壓棧操作,出棧操作和返回棧頂元素操作:

 

壓棧操作:

[cpp] view plain copy


  1. int QStack_Push(QStack* stack, void* item)  
  2. {  
  3.     TQStack* aStack = (TQStack*)stack;  
  4.       
  5.     int ret = (NULL!=aStack) && (NULL!=item);  
  6.       
  7.     if(ret)  
  8.     {  
  9.         if(0 == LinkQueue_Length(aStack->queue_A))  
  10.         {  
  11.             ret = LinkQueue_Append(aStack->queue_B, item);     
  12.         }  
  13.         else  
  14.         {  
  15.             ret = LinkQueue_Append(aStack->queue_A, item);  
  16.         }  
  17.           
  18.     }  
  19.       
  20.     return ret;  
  21. }  


如圖:

  

出棧操作:

[cpp] view plain copy


  1. void* QStack_Pop(QStack* stack)  
  2. {  
  3.     TQStack* aStack = (TQStack*)stack;  
  4.       
  5.     void* ret = NULL;  
  6.       
  7.     if((NULL!=aStack) && (0<QStack_Length(aStack)))  
  8.     {  
  9.         if(0 == LinkQueue_Length(aStack->queue_B))  
  10.         {  
  11.             while(LinkQueue_Length(aStack->queue_A) > 1)  
  12.             {  
  13.                 LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));  
  14.             }  
  15.               
  16.             ret = LinkQueue_Retrieve(aStack->queue_A);  
  17.         }  
  18.         else   
  19.         {  
  20.             while(LinkQueue_Length(aStack->queue_B) > 1)  
  21.             {  
  22.                 LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));  
  23.             }  
  24.               
  25.             ret = LinkQueue_Retrieve(aStack->queue_B);  
  26.         }  
  27.     }  
  28.       
  29.     return ret;  
  30. }  


如圖:

返回棧頂元素:

[cpp] view plain copy


  1. void* QStack_Top(QStack* stack)  
  2. {  
  3.     TQStack* aStack = (TQStack*)stack;  
  4.       
  5.     void* ret = NULL;  
  6.       
  7.     if((NULL!=aStack) && (0<QStack_Length(stack)))  
  8.     {  
  9.         if(0 == LinkQueue_Length(aStack->queue_B))  
  10.         {  
  11.             while(LinkQueue_Length(aStack->queue_A) > 1)  
  12.             {  
  13.                 LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));  
  14.             }  
  15.               
  16.             ret = LinkQueue_Header(aStack->queue_A);  
  17.             LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));  
  18.         }  
  19.         else  
  20.         {  
  21.             while(LinkQueue_Length(aStack->queue_B) > 1)  
  22.             {  
  23.                 LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));  
  24.             }  
  25.               
  26.             ret = LinkQueue_Header(aStack->queue_B);  
  27.             LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));  
  28.         }  
  29.     }  
  30.       
  31.     return ret;  
  32. }  


如圖:

            

OK! 上代碼:

QStack.h : 

[cpp] view plain copy


  1. #ifndef _QSTACK_H_  
  2. #define _QSTACK_H_  
  3.   
  4. typedef void QStack;  
  5.   
  6. QStack* QStack_Create();  
  7.   
  8. void QStack_Destroy(QStack* stack);  
  9.   
  10. void QStack_Clear(QStack* stack);  
  11.   
  12. int QStack_Push(QStack* stack, void* item);  
  13.   
  14. void* QStack_Pop(QStack* stack);  
  15.   
  16. void* QStack_Top(QStack* stack);  
  17.   
  18. int QStack_Length(QStack* stack);  
  19.   
  20. #endif  


 

QStack.c :

 

[cpp] view plain copy


  1. #include <malloc.h>  
  2. #include “LinkQueue.h”  
  3. #include “QStack.h”  
  4.   
  5. typedef struct _tag_QStack  
  6. {  
  7.     LinkQueue* queue_A;  
  8.     LinkQueue* queue_B;  
  9. }TQStack;  
  10.   
  11. QStack* QStack_Create()  
  12. {  
  13.     TQStack* ret = (TQStack*)malloc(sizeof(TQStack));  
  14.       
  15.     if(NULL != ret)  
  16.     {  
  17.         ret->queue_A = LinkQueue_Create();  
  18.         ret->queue_B = LinkQueue_Create();  
  19.           
  20.         if((NULL==ret->queue_A) || (NULL==ret->queue_B))  
  21.         {  
  22.             LinkQueue_Destroy(ret->queue_A);  
  23.             LinkQueue_Destroy(ret->queue_B);  
  24.               
  25.             free(ret);  
  26.             ret = NULL;  
  27.         }  
  28.     }  
  29.       
  30.     return ret;  
  31. }  
  32.   
  33. void QStack_Destroy(QStack* stack)  
  34. {  
  35.     QStack_Clear(stack);  
  36.       
  37.     free(stack);      
  38. }  
  39.   
  40. void QStack_Clear(QStack* stack)  
  41. {  
  42.     while(QStack_Length(stack) > 0)  
  43.     {  
  44.         QStack_Pop(stack);  
  45.     }  
  46. }  
  47.   
  48. int QStack_Push(QStack* stack, void* item)  
  49. {  
  50.     TQStack* aStack = (TQStack*)stack;  
  51.       
  52.     int ret = (NULL!=aStack) && (NULL!=item);  
  53.       
  54.     if(ret)  
  55.     {  
  56.         if(0 == LinkQueue_Length(aStack->queue_A))  
  57.         {  
  58.             ret = LinkQueue_Append(aStack->queue_B, item);     
  59.         }  
  60.         else  
  61.         {  
  62.             ret = LinkQueue_Append(aStack->queue_A, item);  
  63.         }  
  64.           
  65.     }  
  66.       
  67.     return ret;  
  68. }  
  69.   
  70. void* QStack_Pop(QStack* stack)  
  71. {  
  72.     TQStack* aStack = (TQStack*)stack;  
  73.       
  74.     void* ret = NULL;  
  75.       
  76.     if((NULL!=aStack) && (0<QStack_Length(aStack)))  
  77.     {  
  78.         if(0 == LinkQueue_Length(aStack->queue_B))  
  79.         {  
  80.             while(LinkQueue_Length(aStack->queue_A) > 1)  
  81.             {  
  82.                 LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));  
  83.             }  
  84.               
  85.             ret = LinkQueue_Retrieve(aStack->queue_A);  
  86.         }  
  87.         else   
  88.         {  
  89.             while(LinkQueue_Length(aStack->queue_B) > 1)  
  90.             {  
  91.                 LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));  
  92.             }  
  93.               
  94.             ret = LinkQueue_Retrieve(aStack->queue_B);  
  95.         }  
  96.     }  
  97.       
  98.     return ret;  
  99. }  
  100.   
  101. void* QStack_Top(QStack* stack)  
  102. {  
  103.     TQStack* aStack = (TQStack*)stack;  
  104.       
  105.     void* ret = NULL;  
  106.       
  107.     if((NULL!=aStack) && (0<QStack_Length(stack)))  
  108.     {  
  109.         if(0 == LinkQueue_Length(aStack->queue_B))  
  110.         {  
  111.             while(LinkQueue_Length(aStack->queue_A) > 1)  
  112.             {  
  113.                 LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));  
  114.             }  
  115.               
  116.             ret = LinkQueue_Header(aStack->queue_A);  
  117.             LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));  
  118.         }  
  119.         else  
  120.         {  
  121.             while(LinkQueue_Length(aStack->queue_B) > 1)  
  122.             {  
  123.                 LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));  
  124.             }  
  125.               
  126.             ret = LinkQueue_Header(aStack->queue_B);  
  127.             LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));  
  128.         }  
  129.     }  
  130.       
  131.     return ret;  
  132. }  
  133.   
  134. int QStack_Length(QStack* stack)  
  135. {  
  136.     TQStack* aStack = (TQStack*)stack;  
  137.       
  138.     int ret = -1;  
  139.       
  140.     if(NULL != aStack)  
  141.     {  
  142.         ret = LinkQueue_Length(aStack->queue_B) +  
  143.               LinkQueue_Length(aStack->queue_A);  
  144.     }  
  145.       
  146.     return ret;  
  147. }  


 

Main.c     :

            

[cpp] view plain copy


  1. #include <stdio.h>  
  2. #include “QStack.h”  
  3.   
  4. int main(void)  
  5. {  
  6.     QStack* stack = QStack_Create();  
  7.       
  8.     int a[10];  
  9.     int i = 0;  
  10.   
  11.     for(i=0; i<10; i++)  
  12.     {  
  13.         a[i] = i;  
  14.           
  15.         QStack_Push(stack, a+i);  
  16.     }  
  17.       
  18.     printf(”Header:   %d\n”, *(int*)QStack_Top(stack));  
  19.     printf(”Length:   %d\n\n”, QStack_Length(stack));  
  20.       
  21.     while(QStack_Length(stack) > 0)  
  22.     {  
  23.         printf(”Pop:  %d\n”, *(int*)QStack_Pop(stack));  
  24.     }  
  25.     printf(”\n”);  
  26.       
  27.     for(i=0; i<6; i++)  
  28.     {  
  29.         a[i] = i+10;  
  30.           
  31.         QStack_Push(stack, a+i);  
  32.     }  
  33.       
  34.     while(QStack_Length(stack) > 0)  
  35.     {  
  36.         printf(”Pop:  %d\n”, *(int*)QStack_Pop(stack));  
  37.     }  
  38.       
  39.     QStack_Destroy(stack);  
  40.       
  41.     return 0;  
  42. }  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章