/*
* 简单顺序栈的实现
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
/*
* 自定义bool类型
*/
typedef int BOOL ;
#define TRUE 1
#define FALSE 0
const int STACK_INIT_SIZE = 100;
const int STACK_INCREMENT = 20;
typedef int datatype;
typedef struct {
datatype *base;
datatype *top;
//栈的最大容量
int maxSize;
}Stack;
/*
* 顺序栈的初始化
*/
BOOL initStack(Stack *s) {
//使用malloc函数给栈分配空间
s->base = (datatype *)malloc(STACK_INIT_SIZE*sizeof(datatype));
if(s->base == NULL) {
return FALSE;
}
//初始化是栈顶和栈低指针相同
s->top = s->base;
s->maxSize = STACK_INIT_SIZE;
return TRUE;
}
/*
* 往顺序栈中插入一个元素
*/
BOOL push(Stack *s, datatype elem) {
//若超出范围则重新分配空间
if(s->top - s->base >= s->maxSize) {
printf("超出范围!\n");
s->base = (datatype *)realloc(s->base,
(STACK_INIT_SIZE + STACK_INCREMENT)*sizeof(datatype));
if(s->base == NULL) {
printf("分配失败!\n");
return FALSE;
}
s->top = s->base + s->maxSize;
s->maxSize += STACK_INCREMENT;
}
//elem插入栈中,并作为栈顶元素
*(s->top) = elem;
//top指向栈顶元素的下一个位置
s->top++;
return TRUE;
}
/*
* 取得顺序栈的栈顶元素
*/
BOOL getTop(Stack s, datatype *elem) {
if(s.top == s.base){
printf("栈中无元素\n");
return FALSE;
}
*elem = *(s.top-1);
return TRUE;
}
/*
* 删除顺序栈的栈顶元素
*/
BOOL pop(Stack *s, datatype *elem) {
if(s->top == s->base) {
printf("栈中无元素\n");
return FALSE;
}
s->top--;
*elem = *(s->top);
return TRUE;
}
/*
* 顺序栈的长度
*/
int length(Stack s) {
return (s.top - s.base);
}
/*
* 清空顺序栈
*/
void clear(Stack *s) {
s->top = s->base;
}
/*
* 打印栈中的元素
*/
void printStack(Stack *s) {
datatype *p = s->base;
while(p != s->top) {
printf("%d ", *p);
p++;
}
}
PS:在使用malloc函数动态分配空间时由于没有引入<malloc.h>头文件会发生 "隐式声明与内建函数 ‘malloc’ 不兼容"错误,
这时引入相应的头文件即可。