用數組實現棧結構
阿新 • • 發佈:2017-07-20
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 }
運行方法和結果顯示
用數組實現棧結構