数据结构之 栈(C语言实现)
1.栈的模型
栈(stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶(top)。对栈的基本操作有push(进栈)和pop(出栈),前者相当于插入,后者则是删除最后插入的元素。最后插入的元素可以通过使用top例程在执行pop之前进行考察。对空栈进行的pop或top一般被认为是栈ADT的错误。另一方面,当运行push时空间用尽是一个实现错误,但不是ADT错误。
2. 栈的数组实现
- stack.h文件
#ifndef _STACK_H_
#define _STACK_H_
#define EmptyTOS -1 //空栈
#define MinStackSize 5 //栈的最小值
typedef int elementType; //数据类型
typedef struct stackRecord
{
int capacity;//容量
int stackTop;//栈顶
elementType *array;
}STACK;
int isEmpty(STACK *s); //判空
int isFull(STACK *s); //判满
STACK *createStack(int maxElements); //栈的创建
void disposeStack(STACK *s); //栈的释放
void makeEmpty(STACK *s); //创建空栈
void push(elementType element, STACK *s);//入栈
elementType top(STACK *s); //返回栈顶元素
void pop(STACK *s); //出栈
elementType topAndTop(STACK *s); //出栈并返回栈顶元素
#endif
- stack.c
#include <stdlib.h>
#include <stdio.h>
#include "stack.h"
int isEmpty(STACK *s)
{
return (s->stackTop == EmptyTOS);
}
int isFull(STACK *s)
{
return (s->stackTop == s->capacity -1);
}
STACK *createStack(int maxElements)
{
STACK *s;
if(maxElements < MinStackSize) {
printf("Stack size si too small\n");
return NULL;
}
s = (STACK *)malloc(sizeof(struct stackRecord));
s->array = (elementType *)malloc(sizeof(elementType) * maxElements);
s->capacity = maxElements;
makeEmpty(s);
return s;
}
void disposeStack(STACK *s)
{
if(s != NULL) {
free(s->array);
free(s);
}
}
void makeEmpty(STACK *s)
{
if(s != NULL) {
s->stackTop = EmptyTOS;
}
}
void push(elementType element, STACK *s)
{
if(!isFull(s)) {
s->stackTop++;
s->array[s->stackTop] = element;
} else {
printf("full stack\n");
}
}
elementType top(STACK *s)
{
if(!isEmpty(s)) {
return s->array[s->stackTop];
} else {
printf("empty stack\n");
return 0;
}
}
void pop(STACK *s)
{
if(!isEmpty(s))
s->stackTop--;
else
printf("empty stack\n");
}
elementType topAndTop(STACK *s)
{
if(!isEmpty(s)) {
return s->array[s->stackTop--];
} else {
printf("empty stack\n");
return 0;
}
}