栈是一种限制线性列表,该类列表的添加和删除操作只能在一端实现,称为栈顶。栈的实现可以使用数组也可以使用链表来实现。
下面的C语言部分实现了顺序栈的基本操作,包括栈的初始化、入栈、出栈、获得栈顶元素的值等。
#include <stdio.h>
#include <stdbool.h>
/*定义栈的大小*/
#define maxsize 100
typedef int ElemType;
/*顺序栈的实现*/
typedef struct SqStack
{
ElemType data[maxsize];
int top;
}SqStack;
/*栈的初始化*/
void initstack(SqStack * s)
{
if(NULL == s)
return;
s->top = -1;
}
/*判断栈空*/
bool stackempty(SqStack *s)
{
if(NULL == s)
return true;
if(-1 == s->top)
return true;
else
return false;
}
/*判断栈满*/
bool stackfull(SqStack *s)
{
if(NULL == s)
return false;
if(s->top >= maxsize-1)
return true;
else
return false;
}
/*入栈操作*/
void push(SqStack *s,ElemType x)
{
if(stackfull(s))
return;
s->top += 1;
s->data[s->top] = x;
}
/*出栈操作*/
int pop(SqStack *s,ElemType *x)
{
if(stackempty(s))
return -1;
*x = s->data[s->top];
s->top--;
return 0;
}
/*获取栈顶元素*/
int gettop(SqStack *s,ElemType *x)
{
if(stackempty(s))
return -1;
*x = s->data[s->top];
return 0;
}
/*清空栈*/
void clearstack(SqStack *s)
{
if(stackempty(s))
return;
s->top = -1;
}
int main(int argc, const char * argv[])
{
SqStack s;
ElemType x = 0;
initstack(&s);
if(s.top != -1)
printf("error");
/*入栈100个元素*/
for(int i = 0;i < 100;i++)
push(&s,i);
/*判断此时栈满*/
if(!stackfull(&s))
printf("error");
/*出栈,打印栈顶元素值*/
for(int i = 0;i < 100;i++)
{
pop(&s,&x);
printf("%d ",x);
/*每行打印10个元素*/
if(0 == (i+1)%10)
printf("\n");
}
/*判断此时栈满*/
if(!stackempty(&s))
printf("error");
return 0;
}
上面的实现是使用数组来实现栈,有一个明显的缺陷是栈的大小在开始时就已经确定,无法扩展。可以使用realloc函数对上述代码进行修改.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/*定义栈的初始大小*/
#define STACK_INITSIZE 100
/*定义增幅*/
#define STACK_INCREMENT 100
typedef int ElemType;
int realsize = STACK_INITSIZE;
/*顺序栈的实现*/
typedef struct SqStack
{
/*指向申请的内存,用于存储栈数据结构*/
ElemType *data;
int top;
}SqStack;
/*栈的初始化*/
int initstack(SqStack * s)
{
/*入参为NULL,返错*/
if(NULL == s)
return -1;
s->top = -1;
s->data = (ElemType *)malloc(STACK_INITSIZE * sizeof(ElemType));
/*申请内存失败,返错*/
if(NULL == s->data)
return -1;
return 0;
}
/*判断栈空*/
bool stackempty(SqStack *s)
{
if(NULL == s)
return true;
if(-1 == s->top)
return true;
else
return false;
}
/*入栈操作*/
int push(SqStack *s,ElemType x)
{
if(NULL == s)
return -1;
/*栈满,再分配STACK_INCREMENT个元素*/
if(realsize-1 == s->top)
{
realsize += STACK_INCREMENT;
s->data = (ElemType *)realloc(s->data,realsize*sizeof(ElemType));
/*申请内存失败,返错*/
if(NULL == s->data)
return -1;
}
s->top += 1;
s->data[s->top] = x;
return 0;
}
/*出栈操作*/
int pop(SqStack *s,ElemType *x)
{
if(NULL == s)
return false;
if(stackempty(s))
return -1;
*x = s->data[s->top];
s->top--;
return 0;
}
/*获取栈顶元素*/
int gettop(SqStack *s,ElemType *x)
{
if(stackempty(s))
return -1;
*x = s->data[s->top];
return 0;
}
/*清空栈,只是将top设置为-1,没有释放申请的内存*/
void clearstack(SqStack *s)
{
if(stackempty(s))
return;
s->top = -1;
}
void destorystack(SqStack *s)
{
if(NULL == s)
return;
if(s->data != NULL)
free(s->data);
s->top = -1;
}
int main(int argc, const char * argv[])
{
SqStack s;
ElemType x = 0;
initstack(&s);
if(s.top != -1)
printf("error");
/*入栈200个元素*/
for(int i = 0;i < 200;i++)
push(&s,i);
/*出栈,打印栈顶元素值*/
for(int i = 0;i < 200;i++)
{
pop(&s,&x);
printf("%d ",x);
/*每行打印10个元素*/
if(0 == (i+1)%10)
printf("\n");
}
/*判断此时栈空*/
if(!stackempty(&s))
printf("error");
destorystack(&s);
return 0;
}