最开始的时候都是简单的实现,很多问题没有考虑,现在将堆栈重新实现一遍(数组表示);
实现三步骤
- 确定堆栈的结构,实现思路
- 考虑程序健壮性,边界情况等
- 函数实现(多种功能)
对于堆栈,特征是先入后出;
几个功能函数分别是
- pop
- push
- top(只返回栈顶值,但是不删除,栈维持原样)
1、静态数组堆栈
栈的结构体表示如下:
#define STACK_TYPE int #define STACK_SIZE 100 typedef struct{ STACK_TYPE content[STACK_SIZE]; int top; }stack;
函数接口设计如下:
void stack_init(stack **, int ); void push(stack *,STACK_TYPE); STACK_TYPE pop(stack *); STACK_TYPE Top(stack *);
要使用堆栈,首先要对其进行初始化(当然,在用完后,要记住对其的释放,或者写一个释放函数与初始化函数对应):
/*这里要注意,传入的参数一定要指向指针的指针,否则无法获得修改后的指针(传值不传址)*/ void stack_init(stack **a, int size) { int i; if(a == NULL || size <=0){ printf("the parameters is illegal\n"); exit(-1); } *a = (stack *)malloc(sizeof(stack)); for(i=0; i<size; i++) (*a)->content[i] = 0; (*a)->top = -1; }
初始化后,可以获得指向堆栈的指针,后续都是对指向堆栈结构体记性操作首先是push操作
void push(stack *stack, STACK_TYPE input) { assert(!is_full(stack)); //如果值为真,则继续执行(if_full为0,表示未满) stack->top += 1; stack->content[stack->top] = input; }
在push操作中,要用到is_full函数,用来判断堆栈是否满,代码如下:
最开始的时候使用return stack->top == STACK_SIZE - 1,但是如果别人一次加2个数,就有可能跳过该判断,导致溢出static int is_full(stack *stack) { return stack->top > STACK_SIZE - 1; }
然后是pop()操作
其中用到了is_empty()函数,用来判断堆栈是否为空,如果为空,就不能继续popSTACK_TYPE pop(stack *stack) { //assert(!is_empty()); STACK_TYPE temp; if(is_empty(stack)) return -1; temp = stack->content[stack->top]; stack->content[stack->top] = 0; stack->top -= 1; return temp; }
static int is_empty(stack *stack) { return stack->top <= -1; }
top代码如下
STACK_TYPE Top(stack *stack) { //assert(!is_empty()); if(is_empty(stack)) return -1; return stack->content[stack->top]; }
2、动态数组堆栈
上面使用的数组大小是固定的,如果需要动态的堆栈怎么办?下面是动态数组的实现方法
堆栈结构体表示如下:
typedef struct{ STACK_TYPE *content; int top; }stack;
下面的工作就是按需求对其进行初始化,stack_init的第二个参数size又起到了更重要的作用,不仅仅是用来初始化数组,而且用来定义数组的长度
/*这里要注意,传入的参数一定要指向指针的指针,否则无法获得修改后的指针(传值不传址)*/ void stack_init(stack **a, int size) { int i; if(a == NULL || size <=0){ printf("the parameters is illegal\n"); exit(-1); } *a = (stack *)malloc(sizeof(stack)); (*a)->content = (STACK_TYPE *)malloc(size*sizeof(STACK_TYPE)); for(i=0; i<size; i++) (*a)->content[i] = 0; (*a)->top = -1; }