1、定义
栈是限制仅能在表的一端进行插入和删除操作的线性表
栈顶(top): 允许插入和删除的一端
栈底(bottom): 不允许插入和删除的一端
空栈: 不含元素的空表
2、栈的存储结构
(1)顺序
结构定义:
#define mazsize 100 //栈的最大容量
typedef int elemtype;
typedef struct
{
elemtype elem[mazsize];
int top;
}sqstacktp;
初始化栈:
void Initstack(sqstacktp *s)
{
s->top = 0; //将顺序栈s初始化为0
}
判断栈空:
int StackEmpty(sqstacktp *s)
{
if (s->top > 0)
return 0;
else
return 1;
}
压栈:
void Push(sqstacktp *s,elemtype x)
{
if (s->top == maxsize)
printf("Overflow");
else
s->elem[s->top++] = x; //x进栈
}
出栈:
elemtype Pop(sqstacktp *s)
{
if (s->top == 0)
return NULL;
else
{
s->top--; //栈顶指针减1
return s->elem[s->top]; //返回栈顶元素值
}
}
求栈深:
int Size(sqstacktp *s)
{
return s->top;
}
取栈顶元素操作:
elemtype Top(sqstacktp *s)
{
if (s->top == 0)
return NULL;
else
return s->elem[s->top-1];
}
(2)链式
结构定义:
typedef int elemtype;
typedef struct stacknode
{
elemtype data;
struct stacknode *next;
}stacknode;
typedef struct
{
stacknode *top; //栈顶指针
}LinkStack;
初始化:
void InitStack(LinkStack *ls)
{
ls->top = NULL;
}
进栈:
void Push(LinkStack *ls, elemtype x)
{
stacknode *s = NULL;
s = (stacknode *)malloc(sizeof(stacknode)); //生成新结点
s->data = x;
s->next = ls->top; //链入新结点
ls->top = s; //修改栈顶指针
}
出栈:
elemtype Pop(LinkStack *ls)
{
stacknode *p = NULL;
elemtype x;
if (ls->top == NULL) //删除栈顶元素返回NULL
return NULL;
else
{
x = (ls->top)->data;
p = ls->top;
ls->top = p->next;
free(p);
return x; //返回元素值
}
}