已經十一點,這是今天的第三篇博客了,為什么今天要寫這么多呢。因為這些代碼是之前寫好的,寫起來比較快。當然不是這個原因,真正的原因是下午玩了一下午游戲,好累,想睡覺,躺在床上看了一篇不知哪年畢業的學長講他面試的經歷的博客。我被刺激到了。呵呵。。。
對於棧的性質和定義我就不多說了。之前利用棧寫過表達式計算器,有興趣的同學可以試試。遞歸與棧的聯系很密切,應該說遞歸就是靠棧來實現的。
astack.h
#ifndef _STACK_H #define _STACK_H #define MAXSIZE 10 typedef struct stack { int * arr;//循環隊列首地址 int size;//大小 } Stack; void s_init(Stack * stack);//初始化 int s_size(Stack * stack);//棧大小 void s_push(Stack * stack, const int data);//入棧 void s_pop(Stack * stack);//出棧 int s_top(Stack * stack);//棧頂 bool s_empty(Stack * stack);//為空 bool s_full(Stack * stack);//為滿 void s_destroy(Stack * stack);//銷毀 #endif //_STACK_H
astack.c
#include <stdio.h> #include <stdlib.h> #include <assert.h> #include "astack.h" void s_init(Stack * stack) { stack->arr = (int *)malloc( sizeof(int) * MAXSIZE );//創建一個循環隊列的數組 stack->size = 0;//初始化大小為0 } int s_size(Stack * stack) { assert(stack->size > 0); return stack->size;//返回元素個數 } void s_push(Stack * stack, const int data) { if ( s_full(stack) )//當隊列為滿時,不能進行入棧操作 return; stack->arr[stack->size] = data;//棧頂指針=size-1,而要添加的位置是 棧頂指針+1,也就是size stack->size++; } void s_pop(Stack * stack) { if ( s_empty(stack) )//當隊為空時,不能進行出隊操作 return; stack->size--;//出隊只需將棧頂指針-1,也就是size-1 } int s_top(Stack * stack) { assert(stack->size > 0 ); return stack->arr[stack->size - 1];//size-1才是棧頂元素 } bool s_empty(Stack * stack) { return stack->size == 0; } bool s_full(Stack * stack) { return stack->size == MAXSIZE; } void s_destroy(Stack * stack) { free(stack->arr); }
2016-01-10