1. 程式人生 > >軟考:資料結構基礎——棧

軟考:資料結構基礎——棧

我們實現了可以動態增加棧大小的動態棧 並對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;
}