栈的学习
1.栈的定义
栈(stack)是限制仅在表一端进行插入或删除操作的线性表。
(1)通常称插入或删除的一端为栈顶(Top),另一端为栈底(Bottom)
(2)当表中没有元素时称为空栈
(3)栈为后进先出(last in first out)线性表,也称为LIFO表
2.顺序栈
顺序栈的类型定义
#define stacksize 1000; //预分配的栈的空间最多为1000个元素 typedef int datatype; struct seqstack { datatype data[stacksize]; int top; };
顺序栈的基本操作
栈置空
/** * Description:栈置空 */ void initstack(struct seqstack *s) { s -> top = -1; }
栈判空
/** * Description:判断栈空 */ int stackempty(struct seqstack *s) { int flag; flag = (s -> top == -1)? 1 : 0; return flag; }
判栈满
/** * Description:判断栈满 */ int stackfull(struct seqstack *s) { int flag; flag = (s -> top == stacksize)? 1 : 0; return flag; }
入栈、出栈操作
/** * Description:进栈操作 */ void push(struct seqstack *s,x) { s -> top ++; if(stackfull) exit("stack overflow\n"); //数组溢出 s -> data[s -> top] = x; } /** * Description:出栈操作 */ void pop(struct seqstack *s) { if(stackempty(s)) exit("stack is empty!\n"); //数组为空 return s -> data[s -> top --]; }
获取栈顶元素
/** * Description:获取栈顶元素 */ datatype stacktop(struct seqstack *s) { if(stackempty(s)) exit("stack is empty!\n"); //数组为空 return s -> data[s -> top]; }
3.链栈
链栈的类型定义
链栈是没有附加头结点的运算受限的单链表。栈顶指针就是链表的头指针。
typedef struct stacknode { datatype data; struct stacknode *next; }stacknode; typedef struct { stacknode *top; //栈顶指针 }linkstack;
注意:
(1)linkstack结构类型定义是为了函数体中修改top指针本身
链栈的基本运算
栈置空
/** * Description:栈置空 */ void initstack(linkstack *s) { s -> top = NULL; }
判断栈空
/** * Description:判断栈空 */ int stackempty(linkstack *s) { int flag; flag = (s -> top == NULL)? 0 : 1; return flag; }
入栈、出栈操作
/** * Description:入栈 */ void push(linkstack *s, datatype x) { struct stacknode *p; p = malloc(sizeof(struct stacknode)); p -> data = x; p -> next = s -> top; s -> top = p; } /** * Description:出栈 */ datatype pop(linkstack *s) { datatype x; struct stacknode *p = s -> top; if(stackempty(s)) exit("stack is empty!\n"); x = p -> data; s -> top = p -> next; free(p); return x; }
获取栈顶元素
/** * Description:获取栈顶元素 */ datatype stacktop(linkstack *s) { if(stackempty(s)) exit("stack is empty!\n"); return s -> top -> data; }