c语言实现数组栈

  已经十一点,这是今天的第三篇博客了,为什么今天要写这么多呢。因为这些代码是之前写好的,写起来比较快。当然不是这个原因,真正的原因是下午玩了一下午游戏,好累,想睡觉,躺在床上看了一篇不知哪年毕业的学长讲他面试的经历的博客。我被刺激到了。呵呵。。。

  对于栈的性质和定义我就不多说了。之前利用栈写过表达式计算器,有兴趣的同学可以试试。递归与栈的联系很密切,应该说递归就是靠栈来实现的。

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