數據結構中的棧有“後進先出”的特點,意思是最後被存進棧中的數據,總是最早被取走
一個棧只有初始化,銷燬,入棧,出棧和取棧頂元素,這些限制往往使在操作數據時更安全,代碼容易實現,出現BUG的機會就很少
上圖中,棧中有3個元素,棧頂元素是data3,如果是入棧操作則data4放入棧頂,此時棧中有四個元素,棧頂元素是data4,如果出棧,則data4被取出,棧頂元素變爲data3,具體實現代碼如下:
頭文件(SeqStack.h):
#pragma once
#include<stdio.h>
#include<stdlib.h>
typedef char StackType;
typedef struct SeqStack{
StackType* space; //該指針指向一段向堆申請的空間
size_t size; //棧的元素個數
size_t max_size; //棧的最大存儲元素個數
}SeqStack;
void SeqStackInit(SeqStack* stack); //棧的初始化
void SeqStackDestroy(SeqStack* stack); //銷燬棧
void SeqStackPush(SeqStack* stack, StackType value); //入棧
void SeqStackPop(SeqStack* stack); //出棧
int SeqStackTop(SeqStack* stack, StackType* output_value); //去棧頂元素
頭文件的實現(SeqStack)
#include"SeqStack.h" void SeqStackInit(SeqStack* stack){ if(stack == NULL) { return; } stack->size = 0; stack->max_size = 1000; stack->space = malloc(stack->max_size * sizeof(StackType)); } void SeqStackDestroy(SeqStack* stack) { if(stack == NULL) { return; } free(stack->space); stack->space = NULL; stack->size = 0; stack->max_size = 0; } void SeqStackPush(SeqStack* stack, StackType value) { if(stack == NULL) { return; } stack->space[stack->size] = value; stack->size++; if(stack->size >= stack->max_size) { //當棧被填滿時,申請一個更大的空間,並把原來棧中的數據複製過去,銷燬原來的棧,使用新棧 stack->max_size = stack->max_size * 2 + 1; SeqStack* new_stack = malloc(stack->max_size * sizeof(SeqStack)); int i = 0; for(; i < stack->size; i++) { new_stack->space[i] = stack->space[i]; } SeqStackDestroy(stack); stack = new_stack; } } void SeqStackPop(SeqStack* stack) { if(stack == NULL) { return; } stack->size--; } int SeqStackTop(SeqStack* stack, StackType* output_value) { if(stack == NULL || output_value == NULL) { return 0; } if(stack->size == 0){ return 0; } *output_value = stack->space[stack->size]; return 1; } ///////////////////////////////////////////////////////////////// //以下爲測試代碼 ///////////////////////////////////////////////////////////////// void TestSeqStack() { SeqStack stack; SeqStackInit(&stack); printf("stack->space expected NULL, actual %p\n", stack.space); printf("stack->size expected 0, actual %d\n", stack.size); SeqStackPush(&stack, 'a'); SeqStackPush(&stack, 'b'); SeqStackPush(&stack, 'c'); SeqStackPush(&stack, 'd'); printf("stack->size expected 4, actual %d\n", stack.size); StackType value; int ret; ret = SeqStackTop(&stack, &value); printf("stack->space expected d, actual %c\n", stack.space[stack.size-1]); printf("stack->size expected 1, actual %d\n", ret); SeqStackPop(&stack); ret = SeqStackTop(&stack, &value); printf("stack->space expected c, actual %c\n", stack.space[stack.size-1]); printf("stack->size expected 1, actual %d\n", ret); SeqStackPop(&stack); ret = SeqStackTop(&stack, &value); printf("stack->space expected b, actual %c\n", stack.space[stack.size-1]); printf("stack->size expected 1, actual %d\n", ret); SeqStackPop(&stack); ret = SeqStackTop(&stack, &value); printf("stack->space expected a, actual %c\n", stack.space[stack.size-1]); printf("stack->size expected 1, actual %d\n", ret); SeqStackPop(&stack); ret = SeqStackTop(&stack, &value); printf("stack->space expected 0, actual %d\n", stack.space[stack.size-1]); printf("stack->size expected 0, actual %d\n", ret); } int main(){ TestSeqStack(); return 0; }
實驗結果: