1.1 栈的定义:
栈是限制在表的一端进行插入和删除的线性表。允许插入、删除的这一端称为栈顶,另一个固定端称为栈底。当表中没有元素时称为空栈。
1.2 栈的存储实现和运算实现栈是运算受限的线性表,线性表的存储结构对栈也是适用的,只是操作不同而已。
利用顺序存储方式实现的栈称为顺序栈。与线性表类似,栈的动态分配顺序存储结构如下:
#define STACK_INIT_SIZE 100 //存储空间的初始分配量
#define STACKINCREMENT 10 //存储空间的分配增量
typedef struct{
SElemType *base; //在栈构造之前和销毁之后,base 的值为 NULL
SElemType *top; //栈顶指针
int stacksize; //当前已分配的存储空间
}SqStack;
需要注意,在栈的动态分配顺序存储结构中,base 始终指向栈底元素,非空栈中的 top始终在栈顶元素的下一个位置。
下面是顺序栈上常用的基本操作的实现。
(1)入栈:若栈不满,则将 e 插入栈顶。
int Push (SqStack &S, SElemType e) {
if (S.top-S.base>=S.stacksize)
{……} //栈满,追加存储空间
*S.top++ = e; //top 始终在栈顶元素的下一个位置
return OK;
}
(2)出栈:若栈不空,则删除 S 的栈顶元素,用 e 返回其值,并返回 OK,否则返回
ERROR。
int Pop (SqStack &S, SElemType &e) {
if (S.top==S.base) return ERROR;
e = *--S.top;
return OK;
}
出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。通常栈空常作为一种控制转移的条件。
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define true 1
#define false 0
#define error 0
#define ok 1
//#define SElemType int
typedef int SElemType;
//顺序栈
typedef struct {
SElemType *base;
SElemType *top;
int stacksize; //当前已分配的存储空间
}SqStack;
//初始化栈
int InitStack(SqStack &S)
{
S.base = (SElemType*)malloc(sizeof(SElemType)*STACK_INIT_SIZE);
if (!S.base) return error;
S.stacksize = STACK_INIT_SIZE;
S.top = S.base;
return ok;
}
//销毁栈
int DestroyStack(SqStack &S)
{
S.top = NULL;
S.stacksize = 0;
free(S.base);
return ok;
}
//清空栈
int ClearStack(SqStack &S)
{
S.top = S.base;
return ok;
}
//判断栈是否为空
int StackEmpty(SqStack S)
{
if (S.top == S.base)
return 1;
else
return 0;
}
//栈的长度
int StackLength(SqStack S)
{
return (S.top - S.base);
}
//栈顶元素
int GetTop(SqStack S)
{
if (S.top == S.base)
return false;
SElemType e = *(S.top - 1);
return e;
}
//入栈
//在栈的动态分配顺序存储结构中,base 始终指向栈底元素,非空栈中的 top
//始终在栈顶元素的下一个位置。
int push(SqStack &S, SElemType &e)
{
if (S.top - S.base >= STACK_INIT_SIZE)
{
//栈满
S.base = (SElemType*)realloc(S.base,sizeof(SElemType)*(S.stacksize+STACKINCREMENT));
if (!S.base)
return false;
S.stacksize = S.stacksize + STACKINCREMENT;
S.top = S.base + STACK_INIT_SIZE;
}
//重新定位栈顶元素
*S.top = e;
S.top++;
//*S.top++=e;
return 1;
}
//出栈
int pop(SqStack &S, SElemType &e)
{
if (S.base == S.top) return error;
S.top--;
e = *S.top;
//e=*--S.top;
return e;
}
int printS(SqStack S)
{
if (S.base == NULL)
return error;
if (S.top == S.base)
printf("栈中没有元素\n");
SElemType *p = S.top;
while (p>S.base)
{
p--;
printf("%d\n", *p);
}
}