棧ADT鏈式實現及陣列實現
阿新 • • 發佈:2019-01-27
棧ADT 棧的名詞就不解釋了
先是鏈式實現:
三個程式碼 測試 標頭檔案 及函式實現原始碼
stack.h:
/* 棧型別的標頭檔案 */ #ifndef STACK_H_ #define STACK_H_ struct Node; //先宣告,就可以在下面使用,而不必因定義在後面而產生衝突 /* 一般型別定義 */ typedef int ElementType; //抽象資料型別 typedef struct Node * PtrToNode; typedef PtrToNode Stack; /* 特定於程式的宣告 */ struct Node { ElementType element; PtrToNode next; }; /* 函式原型 */ void MakeEmpty ( Stack s ); int IsEmpty ( Stack s ); void Push ( ElementType x, Stack s ); void Pop ( Stack s ); Stack CreateStack ( void ); void DisposeStack ( Stack s ); ElementType Top ( Stack s ); #endif
stack.c:
/* list.c -- 支援棧操作的函式 */ #include <stdio.h> #include <stdlib.h> #include "stack.h" /* 介面函式 */ /* 把棧初始化為空棧 */ void MakeEmpty ( Stack s ) { if ( NULL == s ) { printf ( "必須首先建立一個棧!\n" ); } else { while ( !IsEmpty ( s ) ) { Pop ( s ); } } } /* 檢查棧是否為空 */ int IsEmpty ( Stack s ) { return ( NULL == s -> next ); } /* 建立一個棧 */ Stack CreateStack ( void ) { Stack s; s = ( Stack )malloc ( sizeof ( struct Node ) ); if ( NULL == s ) { printf ( "建立失敗!\n" ); return NULL; } else { s -> next = NULL; MakeEmpty ( s ); return s; } } /* 棧頂插入元素x */ void Push ( ElementType x, Stack s ) { PtrToNode tmp; //此處為了清楚起見,別用 Stack. tmp = ( Stack )malloc ( sizeof ( struct Node ) ); if ( NULL == tmp ) { printf ( "插入失敗!\n" ); } else { tmp -> element = x; //別忘了賦值這一步. tmp -> next = s -> next; s -> next = tmp; } } /* 棧頂彈出元素 */ void Pop ( Stack s ) { if ( IsEmpty ( s ) ) { ; } else { PtrToNode tmp; tmp = s -> next; s -> next = s -> next -> next; free ( tmp ); } } /* 返回棧頂元素 */ ElementType Top ( Stack s ) { if ( IsEmpty ( s ) ) { return 0; //棧為空,返回0,代表錯誤! } else { return ( s -> next -> element ); } } /* 銷燬棧 */ void DisposeStack ( Stack s ) { PtrToNode tmp; PtrToNode p; p = s -> next; free ( s ); s = NULL; //想想實參形參,外面s的值不會因為這裡而改變. //while ( NULL != p -> next ) //{ // tmp = p -> next; // free ( p ); // p = tmp; //} //free ( p ); while ( NULL != p ) { tmp = p -> next; free ( p ); p = tmp; } }
test.c:
#include "stack.h" #include <windows.h> #include <stdio.h> int main ( void ) { Stack s = CreateStack ( ); //測試CreateStack ( )函式 printf ( "%d\n", ( IsEmpty ( s ) ) ); //測試IsEmpty ( s )函式 Push ( 1, s ); Push ( 2, s ); printf ( "%d\n", ( Top ( s ) ) ); Pop ( s ); printf ( "%d\n", ( Top ( s ) ) ); printf ( "%d\n", ( IsEmpty ( s ) ) ); MakeEmpty ( s ); printf ( "%d\n", ( IsEmpty ( s ) ) ); DisposeStack ( s ); system ( "pause" ); return 0; }