標籤:tac clu real *** default turn bool 空間 while
c/c++ 線性棧
線性棧
下面的代碼實現了以下功能
| 函數 |
功能描述 |
| push |
壓入 |
| pop |
彈出 |
| show_list |
列印 |
| clear |
移動top指標到棧底 |
| destroy |
釋放所有記憶體空間 |
seqstack.h
#ifndef __SEQSTACK__#define __SEQSTACK__#include <stdio.h>#include <malloc.h>#include <assert.h>#include <memory.h>#include <stdbool.h>#define SEQSTACK_INIT_SIZE 8#define ADD_SIZE 1000typedef int ElemType;typedef struct seqstack{ int size; ElemType *base; ElemType *top;}seqstack;void init(seqstack*);void push(seqstack*, ElemType);void show_list(seqstack*);void pop(seqstack*);int length(seqstack*);void clear(seqstack*);void destroy(seqstack*);#endif
seqstack.c
#include "seqstack.h"bool reInit(seqstack* seq){ ElemType* new = (ElemType*)realloc(seq->base, ADD_SIZE *sizeof(ElemType)); if(NULL == new)return true; if(seq->base != new){ seq->base = new; seq->top = seq->base + seq->size + 1; } return false;}void init(seqstack* seq){ ElemType* e = (ElemType*)malloc(sizeof(ElemType) * SEQSTACK_INIT_SIZE); seq->base = seq->top = e; seq->size = 0;}void push(seqstack* seq, ElemType x){ if(seq->size >= SEQSTACK_INIT_SIZE && reInit(seq)){ printf("stack is full\n"); return; } //先賦值,後移動top的指向 *((seq->top)++) = x; seq->size++;}void show_list(seqstack* seq){ ElemType* e = seq->top; while(e-- != seq->base){ printf("%d\n",*e); }}void pop(seqstack* seq){ --seq->top; seq->size--;}int length(seqstack* seq){ return seq->size;}void clear(seqstack* seq){ seq->top = seq->base; seq->size = 0;}void destroy(seqstack* seq){ free(seq->base);}
seqstackmain.c
#include "seqstack.h"int main(){ seqstack list; init(&list); int select = 1; ElemType item; int index; while(select){ printf("*****************************************\n"); printf("*** [1] push [2] pop ***\n"); printf("*** [3] show_list [4] length ***\n"); printf("*** [5] clear [6] destroy ***\n"); printf("*** [0] quit ***\n"); printf("*****************************************\n"); printf("請選擇:>"); scanf("%d", &select); if(0 == select) break; switch(select){ case 1: printf("請輸入要插入的資料>\n"); scanf("%d",&item); push(&list, item); show_list(&list); break; case 2: pop(&list); show_list(&list); break; case 3: show_list(&list); break; case 4: printf("length is %d\n", length(&list)); show_list(&list); break; case 5: clear(&list); show_list(&list); break; case 6: destroy(&list); break; default: printf("輸入的選擇錯誤,請重新選擇\n"); break; } } destroy(&list);}
c/c++ 線性棧