一、什么是栈
栈是一种先进后出的数据结构,英文last in first out(LIFO),又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈可以有两种方式实现,一种是顺序存储,一种是链式存储,下面就来说一下两种方式的实现。
二、栈的顺序存储结构
关于函数定义要用到的一些宏:
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
typedef int Status;
typedef int ElemType;
首先定义构成栈的结构体:
typedef int ElemType;
typedef int Status; //下面函数的定义会用到
typedef struct {
ElemType *base; /* 栈底指针 */
ElemType *top; /* 栈顶指针 */
int stackSize; /* 当前已分配的存储空间,以元素为单位 */
}SqStack;
- 空栈与栈满
- 构造一个空栈
Status InitStack(SqStack *S)
{
S -> base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if(!S -> base)
return ERROR;
S -> top = S -> base; /* 空栈的栈顶与栈底相等 */
S -> stackSize = STACK_INIT_SIZE;
return OK;
}
- 向栈中插入新的元素
Status Push(SqStack *S,ElemType elem)
{
if(S -> top - S -> base >= S -> stackSize) /* 判断栈是否已满 */
{
ElemType *ptr = (ElemType *) realloc(S -> base,(S -> stackSize + STACK_INCREMENT) * sizeof(ElemType));
if(!ptr)
return ERROR;
S -> base = ptr;
S -> top = S -> base + S -> stackSize;
S -> stackSize += STACK_INCREMENT;
}
*(S -> top) = elem;
S -> top++;
return OK;
}
- 弹出栈顶元素
Status Pop(SqStack *S,ElemType *elem)
{
if(S -> top == S -> base) /* 空栈 */
return ERROR;
*elem = *(S -> top - 1);
S -> top--;
return OK;
}
- 从栈顶往下打印栈中的数据
void PrintSqStack(SqStack *S)
{
ElemType *p = S -> top;
while(p != S -> base) {
printf("%d ",*(p-1));
p--;
}
printf("\n");
}
- 获取栈的长度
int GetSqStacklength(SqStack *S)
{
if(!S -> base)
return ERROR;
return S -> top - S -> base
}
- 判断栈是否为空
Status CheckEmpty(SqStack *S)
{
if(!S -> base)
return ERROR;
if(S -> base == S -> top)
return TRUE;
else
return FALSE;
}
- 销毁栈
Status DestoryStack(SqStack *S)
{
if(!S ->base)
return ERROR;
free(S -> base);
S -> base = NULL;
S -> top = NULL;
S -> stackSize = 0;
return OK;
}
- 置空栈
Status CheckEmpty(SqStack *S)
{
if(!S->base)
return ERROR;
if( S->top == S->base)
return TRUE;
else
return FALSE;
}
在搞清楚栈的存储结构后,相关操作其实很好写出来;
下面是实现的程序:
头文件:
#ifndef _SQSTACK_H_
#define _SQSTACK_H_
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
typedef int Status;
typedef int ElemType;
typedef int ElemType;
typedef int Status; //下面函数的定义会用到
typedef struct {
ElemType *base; /* 栈底指针 */
ElemType *top; /* 栈顶指针 */
int stackSize; /* 当前已分配的存储空间,以元素为单位 */
}SqStack;
Status InitStack(SqStack *S);
Status Push(SqStack *S,ElemType elem);
Status Pop(SqStack *S,ElemType *elem);
void PrintSqStack(SqStack *S);
int GetSqStacklength(SqStack *S);
Status CheckEmpty(SqStack *S);
int DestoryStack(SqStack *S);
Status ClearStack(SqStack *S);
#endif /* ----- #ifndef _SQSTACK_H_ ----- */
主程序:
#include "SqStack.h"
int main(int argc, char *argv[])
{
SqStack S;
SqStack *ps = &S;
int elem = 0;
int i;
InitStack(ps); /* 初始化栈 */
for(i = 1; i <= 50; i++) /* 赋值 */
{
Push(ps,i);
}
printf("length:%d\n",GetSqStacklength(ps)); /* 打印栈的长度 */
Pop(ps,&elem); /* 获取栈顶元素 */
printf("elem = %d\n",elem);
PrintSqStack(ps); /* 打印栈中所有数据 */
ClearStack(ps); /* 置空栈 */
printf("length:%d\n",GetSqStacklength(ps));
return 0;
}
打印结果:
今天就先总结到这里啦!