資料結構---線性表(順序棧)
阿新 • • 發佈:2018-12-16
SqStack.h
#ifndef __SQSTACK_H__ #define __SQSTACK_H__ //一些庫函式的標頭檔案包含 #include <string.h> #include <ctype.h> #include <malloc.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <io.h> #include <math.h> //自定義bool typedef int Boolean; //定義函式返回狀態 typedef int Status; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define STACK_SIZE 10 #define STACK_INCREAMENT 5 typedef struct sqstack { int *base; int *top; int len; }SQSTACK,*PSQSTACK; /* 初始化 */ Status init(PSQSTACK ps); /* 銷燬 */ Status destroy(PSQSTACK ps); /* 重置 */ Status clear(PSQSTACK ps); /* 判空 */ Boolean isEmpty(SQSTACK s); /* 獲取已存元素的數量 */ int listLen(SQSTACK s); /* 獲取棧頂元素 */ Status getTop(SQSTACK s,int *elem); /* 入棧元素 */ Status push(PSQSTACK ps, int elem); /* 出棧元素 */ int pop(PSQSTACK ps, int *elem); /* 瀏覽棧中值 */ Status traverse(SQSTACK s, void (*vi)(int *)); #endif
SqStack.c
#include "SqStack.h" /* 初始化 */ Status init(PSQSTACK ps) { ps->base = (int *)malloc(sizeof(int) * STACK_SIZE); if(!ps->base) { printf("動態記憶體分配失敗"); exit(-1); } ps->top = ps->base; ps->len = STACK_SIZE; return OK; } /* 銷燬 */ Status destroy(PSQSTACK ps) { free(ps->base); ps->base = NULL; ps->top = NULL; ps->len = 0; return OK; } /* 重置 */ Status clear(PSQSTACK ps) { ps->top = ps->base; } /* 判空 */ Boolean isEmpty(SQSTACK s) { if(s.base == s.top) { return TRUE; } else { return FALSE; } } /* 獲取已存元素的數量 */ int listLen(SQSTACK s) { return s.top - s.base; } /* 獲取棧頂元素 */ Status getTop(SQSTACK s,int *elem) { *elem = *(s.top-1); return OK; } /* 入棧元素 */ Status push(PSQSTACK ps, int elem) { //判斷棧是否滿 if(ps->top - ps->base >= ps->len) { ps->base = (int *)realloc(ps->base, sizeof(int)*(ps->len + STACK_INCREAMENT) ); if(!ps->base) { printf("動態記憶體分配失敗"); exit(-1); } ps->top = ps->base + ps->len; ps->len += STACK_INCREAMENT; } *(ps->top++) = elem; return OK; } /* 出棧元素 */ int pop(PSQSTACK ps, int* elem) { if(ps->base == ps->top) { return ERROR; } *elem = *(--ps->top); return OK; } /* 瀏覽棧中值 */ Status traverse(SQSTACK s, void (*vi)(int *)) { while(s.base != s.top) { vi(--s.top); } return OK; }