軟考:資料結構基礎——棧
阿新 • • 發佈:2018-12-01
我們實現了可以動態增加棧大小的動態棧
並對realloc 函式的使用方法回顧了一下
一、棧的定義
1.棧是隻能訪問它的一端來實現資料的儲存和檢索的一種線性結構,他是一種LIFO(Last In First Out)先進先出的線性表。插入和刪除的一端叫做棧頂(TOP),另一端叫做棧底(Botton)。
2.棧的基本操作
1)初始化 init(S) 返回一個空棧
2)判斷空
3)入站PUsh
4)出棧Pop
5) 返回棧頂元素
、
3.棧的應用
(1)用於表示式求值,括號匹配,轉化遞迴過程為非遞迴過程的處理
· ·(2)鏈式的棧,使用鏈式結構儲存的棧
#include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 //棧結構體,由棧頂標誌 top 和 棧空間組成 //這裡是有一片存放int的記憶體 用*base 指向,應用 base[i] 訪問 typedef struct stack{ int *base; int top; } Stack; //給這個空間分配MAX_SIZE*int大小的空間 //初始化 top = 0 void Init(Stack *s){ s->base = (int *)malloc(MAX_SIZE * sizeof(int)); s->top = 0; } //實現入棧 void Push(int data, Stack *s){ if(s->top>99){ //當棧滿了的時候,使用realloc函式(<stdlib.h> 標頭檔案中) //為這片空間重新分配一個更大的空間 //realloc(ptr*, size) 會將ptr記憶體空間中的資料複製到新空間中 //然後將s->base 指向這個新的記憶體空間 s->base = (int *)realloc(s->base,2*sizeof(int)*MAX_SIZE); } //s->base[s->top] 來獲得base[i] 的資料 s->base[s->top] = data; //將標誌top加1 s->top++; } //實現出棧 //出棧並沒有消除出棧的資料,只是下次入棧時會將其覆蓋 int Pop(Stack *s){ int data; if(s->top == 0){ //棧空時提示 printf("the stack is E\n"); return; } //這部操作將先將s->top -1 然後再返回 data = s->base[--s->top]; s->top; return data; } int main(){ Stack s; int i = 0; Init(&s); //我們入棧198個數據來檢查是否為棧分配了新的記憶體 for(i;i<198;i++) Push(i,&s); for(i=198;i>0;i--){ printf("%d\n",Pop(&s)); } return 0; }