一:栈的类型定义:
1.相关概念:
(1)定义:只能在表的一端进行插入和删除的一种线性表
(2)存储结构:用顺序栈或链栈存储均可,但以顺序栈更常见
(3)运算规则:只能在栈顶运算,且访问结点时依照后进先出(LIFO)的原则
与线性表的区别:
二:栈的表示和实现
*顺序栈
1.定义
#define STACK_INIT_SIZE 100; // 存储空间初始分配量
#define STACKINCREMENT 10; // 存储空间分配增量
typedef struct {
SElemType *base; // base的初值为NULL,表明栈结构不存在
SElemType *top; // 栈顶指针,初值指向栈底,
// 即top=base作为栈空的标记
int stacksize; // 当前已分存储空间,即指示当前栈
// 可使用的最大容量,以元素为单位
} SqStack;
2.基本操作:
(1)建栈
Status InitStack(SqStack &s) { //构造一个空栈S
s.base=(SElemType * )malloc(STACK_INIT_SIZE
* sizeof(SElemtype));
If (!s.base) exit (OVERFLOW); //存储分配失败
s.top=s.base;
s.stacksize= STACK_INIT_SIZE;
return OK;
} // InitStack;
(2)取栈顶元素:
Status GetTop(SqStack s, SElemtype &e) {
//若栈不空,用e返回S的栈顶元素
if (s.top = = s.base) return ERROR;
e = * (s.top - 1);
//操作后s.top不变,并将当前栈顶元素赋给e
return OK;
} // GetTop;
//等同于删除栈顶元素(出栈),区别在于:
e = * - - s.top;
//操作后stop减1,并将当前出栈的元素赋给e
(3)插入元素(入栈):
Status Push(Sqstack & s, SElemType e) {
//插入元素e为新的栈顶元素
if (s.top - s.base >= s.stacksize) {
//栈满,追加存储空间
s.base=(SElemtype *)realloc(s.base, s.stacksize +
STACKINCREMENT) * sizeof( Selemtype ));
if (!s.base) exit (OVERFLOW); //存储分配失败
s.top = s.base + s.stacksize;
s.stacksize += STACKINCREMENT;
}
* s.top ++ = e;
//*s.top =e; s.top++;栈顶指针始终在栈顶元素的下一个位置
return OK;
} // Push;
(4)删除栈顶元素(出栈):
Status Pop(SqStack & s, SElemType &e) {
// 若栈不空,删除S的栈顶元素,用e返回其
// 值 ,并返回0K,否则返回ERROR
if (s.top = = s.base) return (ERROR);
e = * - - s.top;
//--s.top; e=*stop;栈顶指针始终在栈顶元素的下一位置
return OK;
} // Pop;
*链栈
1.定义:
栈的链式存储结构称为链栈,它是运算是受限的单链表,插入和删除操作仅限制在表头位置上进行。由于只能在表头进行操作,故没必要附加头结点,栈顶指针就是链表的头指针。
存储结构定义:
typedef struct StackNode{
ElemType data
struct StackNode *next
}StackNode;
typedef struct {
StackNode *top
} LinkStack;
2.基本操作:
(1)初始化:
Void InitStack(LinkStack *s){ //初始化链栈
s–>top=null; }
(2)查询栈顶元素:
ElemType Gettop(LinkStack *s){ //返回栈顶元素
if(StackEmpty(s)) return (ERROR);
return s–>top–>data; }
(3)插入栈顶(入栈)
Status Push(LinkStack *s, ElemType e) {
//插入元素e为新的栈顶元素
q=(StackNode*)malloc(sizeof(StackNode));
q–>data=e;
q–>next=s–>top;
s–>top=q;
}
(4)删除栈顶元素(出栈)
Status Pop( LinkStack *s, ElemType &e) {
//若栈不空,则删除链栈栈顶元素,用e返回其值
if (StackEmpty(s) return (Error);
q=s–>top;
e=q–>data;
s–>top=q–>next;
free(q);
return OK;
}