棧的實現——鏈表和數組

C語言(打印函數採用的c++):

棧的鏈表實現—— 棧的初始化(創建||清空)、入棧、出棧(獲取棧頂元素)
棧的數組實現——初始化、入棧、出棧、清空棧

參考資料:《數據結構與算法分析——C語言描述》 P46

一. 棧的鏈表實現

StackLinkList.cpp

[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. /* 
  2. 功能:棧的鏈表實現: 棧的初始化(創建||清空)、入棧、出棧(獲取棧頂元素) 
  3. Date: 2015/01/23 
  4. Author : quinn 
  5. */  
  6. #include <iostream>  
  7. #include <stdlib.h>  
  8. using namespace std;  
  9. typedef int Item;  
  10. typedef struct Node Node;  
  11. typedef Node* Stack;  
  12. struct Node  
  13. {  
  14.     Item item;  
  15.     Node* next;  
  16. };  
  17. void StackPop(Stack s);  
  18. Stack StackInit(Stack s) //創建或清空(初始化)  
  19. {  
  20.     if (s == NULL) //創建  
  21.     {  
  22.         s = (Stack)malloc(sizeof(*s));  
  23.         s->next = NULL;  
  24.     }  
  25.     else //清空  
  26.         while(s->next != NULL)  
  27.             StackPop(s);  
  28.     cout << "初始化成功!" <<endl;  
  29.     return s;  
  30. }  
  31. void StackPush(Stack s, Item item) //入棧  
  32. {  
  33.     Node* tmpNode = (Node*)malloc(sizeof(*tmpNode));  
  34.     tmpNode->item = item;  
  35.     tmpNode->next = s->next;  
  36.     s->next = tmpNode;  
  37.     cout << "PUSH: " << item <<endl;  
  38. }  
  39. Item StackPopAndTop(Stack s) //出棧並返回棧頂元素值  
  40. {  
  41.     if (s->next == NULL)  
  42.     {  
  43.         cout << "空棧,POPAndTop失敗" <<endl;  
  44.         return -1; //返回-1作警告  
  45.     }  
  46.     else  
  47.     {  
  48.         Node* firstNode = s->next;  
  49.         s->next = s->next->next;  
  50.         return firstNode->item;  
  51.     }  
  52. }  
  53. void StackPop(Stack s) //出棧  
  54. {  
  55.     if (s->next == NULL)  
  56.     {  
  57.         cout << "空棧,POP失敗" <<endl;  
  58.     }  
  59.     else  
  60.     {  
  61.         Node* firstNode = s->next;  
  62.         s->next = s->next->next;  
  63.         free(firstNode);  
  64.     }  
  65. }  
  66. Item StackTop(Stack s) //僅獲取棧頂元素  
  67. {  
  68.     if (s->next == NULL)  
  69.     {  
  70.         cout << "空棧,獲取棧頂元素失敗" <<endl;  
  71.     }  
  72.     return (s->next)->item;  
  73. }  
  74.   
  75. int main()  
  76. {  
  77.     Stack s = NULL;  
  78.     s = StackInit(s);  
  79.     for(int i = 0; i < 10; i++)  
  80.         StackPush(s, i);  
  81.     for(int i = 0; i < 5; i++)  
  82.         cout << StackPopAndTop(s) <<endl;  
  83.     StackInit(s);  
  84.     cout << StackPopAndTop(s) <<endl;  
  85.     system("pause");  
  86.     return 0;  
  87. }  
運行結果:


二. 棧的數組實現

StackArray.cpp
[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. /* 
  2. 功能:棧的數組實現——初始化、入棧、出棧、清空棧 
  3. 注: 定義棧爲空時,棧頂index爲 -1;棧滿時,棧頂index爲棧的長度-1 
  4. Date:2015/01/23 
  5. Author : quinn 
  6. */  
  7. #include <iostream>  
  8. #include "item.h"  
  9. #define STACK_SIZE 10 //認爲設定棧的長度爲10  
  10. #define FULL_STACK (STACK_SIZE - 1)  
  11. #define EMPTY_STACK (-1)  
  12. using namespace std;  
  13. typedef struct stack stack;  
  14. typedef int Item;  
  15. struct stack  
  16. {  
  17.     Item *stackItem;  
  18.     int stackTop;  
  19. };  
  20.   
  21. void Error(const char* str) //異常時輸出提示  
  22. {  
  23.     cout << "Error: " << str << endl;  
  24. }  
  25. int IsFull(stack* s) //判斷是否棧滿  
  26. {  
  27.     if (s->stackTop == FULL_STACK)  
  28.         return 1;  
  29.     else  
  30.         return 0;  
  31. }  
  32. int IsEmpty(stack* s) //判斷是否空棧  
  33. {  
  34.     if (s->stackTop == EMPTY_STACK)  
  35.         return 1;  
  36.     else  
  37.         return 0;  
  38. }  
  39.   
  40. stack* StackInit( stack* s, int maxN) //初始化棧空間  
  41. {  
  42.      s->stackTop = -1; //空棧初始化 Top = -1  
  43.      s->stackItem = (Item*)malloc(maxN * sizeof(Item)); //分配棧空間  
  44.      return s;  
  45. }  
  46. void StackMakeEmpty(stack* s) //清空棧  
  47. {  
  48.     if (!IsEmpty(s))  
  49.         s->stackTop = EMPTY_STACK;  
  50. }  
  51.   
  52. void StackPush(stack* s, Item item) //入棧  
  53. {  
  54.     if (!IsFull(s))  
  55.     {  
  56.         s->stackItem[++(s->stackTop)] = item;  
  57.         cout << "PUSH: " << item <<endl;  
  58.     }  
  59.     else  
  60.         Error("棧已滿,push失敗");  
  61. }  
  62. Item StackPop(stack *s) //出棧  
  63. {  
  64.     if (!IsEmpty(s))  
  65.     {  
  66.         return s->stackItem[(s->stackTop)--];  
  67.     }  
  68.     else  
  69.         Error("空棧,pop失敗");  
  70. }  
  71.   
  72. int main()  
  73. {  
  74.     stack *s = (stack*)malloc(sizeof(*s));  
  75.     StackInit(s, STACK_SIZE);  
  76.     for (int i = 0; i < 11; i++)  
  77.     {  
  78.         StackPush(s, i);  
  79.     }  
  80.     cout << "POP: " << StackPop(s) << endl;  
  81.     cout << "POP: " << StackPop(s) << endl;  
  82.     StackPush(s, 20);  
  83.     cout << "POP: " << StackPop(s) << endl;  
  84.     StackMakeEmpty(s);  
  85.     StackPop(s);  
  86.     StackPush(s, 30);  
  87.     cout << "POP: " << StackPop(s) << endl;  
  88.     system("pause");  
  89.     return 0;  
  90. }  
運行結果:



發佈了4 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章