1. 程式人生 > >用數組實現棧結構

用數組實現棧結構

include 不為 內容 基本操作 its src bool 構造 順序棧

程序的基本結構

包含的文件有:

common.h —— 一般的頭文件,包含了常用的頭文件,狀態

c3-1.h —— 包含了基本操作的原型,類型定義

bo3-1.c —— 基本操作的實現

main3-1.c —— 測試各種操作

common.h中的內容

 1 /* common.h (file name) */
 2 #include<string.h>
 3 #include<ctype.h>
 4 #include<malloc.h>
 5 #include<limits.h>
 6 #include<stdio.h>
 7 #include<stdlib.h>
 8
#include<math.h> 9 /* function result status code */ 10 #define TRUE 1 11 #define FALSE 0 12 #define OK 1 13 #define ERROR 0 14 #define INFEASIBLE -1 15 16 typedef int Status; /* function result status code, such as OK */ 17 typedef int Boolean; /* Boolean type, the value is TRUE or FALSE */

c3-1.h中的內容

 1 /* c3-1.h 棧順序存儲結構 */
 2 
 3 #define STACK_INIT_SIZE 10    /* 存儲空間初始分配量 */
 4 #define STACK_INCREMENT 2     /* 存儲空間分配增量   */
 5 
 6 typedef int SElemType;        /* 定義棧元素的類型   */
 7 
 8 struct _SqStack {
 9   SElemType *base;            /* 在棧構造之前和銷毀之後, base的值為NULL */
10   SElemType *top;             /* 棧頂指針 
*/ 11 int stacksize; /* 當前已分配的存儲空間, 以元素為單位 */ 12 }; /* 順序棧 */ 13 14 typedef struct _SqStack SqStack; 15 16 /* 下面是和棧相關的9個操作 */ 17 18 /* 19 * 構造一個空棧, 棧頂和棧底的指針相同, 20 * 初始的長度為STACK_INIT_SIZE, 目前是10個棧元素 21 */ 22 void InitStack(SqStack *S); 23 24 /* 25 * 銷毀一個已經存在的棧 26 */ 27 void DestroyStack(SqStack *S); 28 29 /* 30 * 把棧S置為空, 主要是將棧頂指針設為棧底指針 31 */ 32 void ClearStack(SqStack *S); 33 34 /* 35 * 判斷棧是不是為空的 36 */ 37 Status StackEmpty(SqStack *S); 38 39 /* 40 * 返回S中元素的個數, 也就是棧的長度 41 */ 42 int StackLength(SqStack *S); 43 44 /* 45 * 返回棧頂的元素到e中, 但是不刪除 46 */ 47 Status GetTop(SqStack *S, SElemType *e); 48 49 /* 50 * 向棧中插入元素 51 */ 52 void Push(SqStack *S, SElemType e); 53 54 /* 55 * 往棧頂插入一個元素 56 */ 57 void Push(SqStack *S, SElemType e); 58 59 /* 60 * 遍歷棧的元素 61 */ 62 void StackTraverse(SqStack *S, void(*visit)(SElemType));

bo3-1.c中的內容

 1 #include "common.h"
 2 #include "c3-1.h"
 3 /* bo3-1.c 順序棧(存儲結構在c3-1.h中定義)的基本操作(9個) */
 4 
 5 void InitStack(SqStack *S) {
 6   /* 構造一個空棧 */
 7   if(!(S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType))))
 8     exit(OVERFLOW); /* 存儲分配失敗 */
 9   S->top = S->base;
10   S->stacksize = STACK_INIT_SIZE;
11 }
12 
13 
14 void DestroyStack(SqStack *S) {
15   /* 銷毀棧S, S不再存在 */
16   free(S->base);
17   /* 除了釋放資源還必須將元素置空或者置 */
18   S->base = NULL;
19   S->top = NULL;
20   S->stacksize = 0;
21 }
22 
23 void ClearStack(SqStack *S) {
24   /* 把S置為空棧, 並沒有釋放掉棧的空間, 而是移動棧頂指針為棧底 */
25   S->top = S->base;
26 }
27 
28 Status StackEmpty(SqStack *S) {
29   /* 判斷棧是不是為空 */
30   if(S->top == S->base)
31     return TRUE;
32   else
33     return FALSE;
34 }
35 
36 int StackLength(SqStack *S) {
37   /* 返回棧S中元素的個數, 也就是棧的長度 */
38   return S->top - S->base;
39 }
40 
41 Status GetTop(SqStack *S, SElemType *e) {
42   /* 若棧不為空, 則用e返回S的棧頂元素, 並返回OK; 否則返回ERROR */
43   if(S->top > S->base) {
44     *e = *(S->top - 1);
45     return OK;
46   } else {
47     return ERROR;
48   }
49 }
50 
51 void Push(SqStack *S, SElemType e) {
52   /* 插入元素e為新的棧頂元素 */
53   if(S->top - S->base >= S->stacksize) {
54     /* 這種情況下棧已經滿了 */
55     S->base = (SElemType *)realloc(S->base, (S->stacksize+STACK_INCREMENT) * 
56                                    sizeof(SElemType));
57     if(!S->base)
58       exit(OVERFLOW); /* 存儲分配失敗 */
59     S->top = S->base + S->stacksize;
60     S->stacksize += STACK_INCREMENT;
61   }
62   *(S->top)++ = e;
63 }
64 
65 Status Pop(SqStack *S, SElemType *e) {
66   /* 若棧不為空, 則刪除棧頂元素, 用e返回其值, 並返回OK */
67   /* 否則返回ERROR */
68   if(S->top == S->base)
69     return ERROR;
70   *e = *--S->top;
71   return OK;
72 }
73 
74 void StackTraverse(SqStack *S, void(*visit)(SElemType)) {
75   /* 從棧底到棧頂依次對棧中每個元素調用函數visit() */
76   /* 這裏要用一個變量保存棧底元素的指針 */
77   SElemType *p = S->base;
78   while(S->top > S->base)
79     visit(*S->base++);
80 
81   S->base = p;
82 }

main3-1.c中的內容

 1 #include "common.h"
 2 #include "c3-1.h"
 3 
 4 void print(SElemType c) {
 5   printf("%d ", c);
 6 }
 7 
 8 int main(void) {
 9   int j;
10   SqStack s;
11   SElemType e;
12   InitStack(&s);   /* 初始化一個棧 */
13   
14   for(j=1; j<=12; j++)
15     Push(&s, j);
16 
17   printf("棧中的元素依次為: ");
18   StackTraverse(&s, print);
19   printf("\n");
20 
21   
22   Pop(&s, &e);
23   printf("彈出的棧頂元素e=%d\n", e);
24 
25   printf("棧是否為空: %d(1:空, 0:否)\n", StackEmpty(&s));
26 
27   GetTop(&s, &e);  /* 獲得棧頂元素, 但是並不彈出棧 */
28   printf("棧頂元素 e=%d 棧的長度為%d\n", e, StackLength(&s));
29 
30   ClearStack(&s);
31   printf("清空棧後, 棧是否為空: %d(1:空 0:否)\n", StackEmpty(&s));
32 
33   DestroyStack(&s);
34   printf("銷毀棧後, s.top=%u, s.base=%u, s.stacksize=%d\n",s.top, s.base, s.stacksize);
35   
36   exit(0);
37 }

運行方法和結果顯示

技術分享

用數組實現棧結構