已经十一点,这是今天的第三篇博客了,为什么今天要写这么多呢。因为这些代码是之前写好的,写起来比较快。当然不是这个原因,真正的原因是下午玩了一下午游戏,好累,想睡觉,躺在床上看了一篇不知哪年毕业的学长讲他面试的经历的博客。我被刺激到了。呵呵。。。
对于栈的性质和定义我就不多说了。之前利用栈写过表达式计算器,有兴趣的同学可以试试。递归与栈的联系很密切,应该说递归就是靠栈来实现的。
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