一、顺序栈的原理
栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈)
允许进行操作的一端称为“栈顶”
另一固定端称为“栈底”
当栈中没有元素时称为“空栈”。特点 :后进先出(LIFO)。
1.栈的应用:
如何排课:
没有前驱的顶点可以通过一个栈去存储,借助于进栈出栈的操作,完成对图的特殊处理,检查它有没有回路。
先入后出
二、顺序栈的实现
它是顺序表的一种,具有顺序表同样的存储结构,由数组定义,配合用数组下标表示的栈顶指针top(相对指针)完成各种操作。
typedef int data_t ; /*定义栈中数据元素的数据类型*/
typedef struct
{
data_t *data ; /*用指针指向栈的存储空间*/
int maxlen; /*当前栈的最大元素个数*/
int top ; /*指示栈顶位置(数组下标)的变量*/
} sqstack; /*顺序栈类型定义*/
1:创建栈
sqstack *stack_create (int len)
{
sqstack *ss;
ss = (seqstack *)malloc(sizeof(sqstack));
ss->data = (data_t *)malloc(sizeof(data_t) * len);
ss->top = -1;
ss->maxlen = len;
return ss;
}
2.清空栈:
stack _clear(sqstack *s)
{
s-> top = -1 ;
}
3.判断栈是否空:
int stack_empty (sqstack *s)
{
return (s->top == -1 ? 1 : 0);
}
4.进栈:
void stack_push (sqstack *s , data_t x)
{ if (s->top = = N - 1){
printf ( “overflow !\n”) ;
return ;
}
else {
s->top ++ ;
s->data[s->top] = x ;
}
return ;
}
5.出栈:
datatype stack_pop(sqstack *s)
{
s->top--;
return (s->data[s->top+1]);
}
6.取栈顶元素:
datatype get_top(sqstack *s)
{
return (s->data[s->top]);
}
分别申请三个指针的空间和栈的空间。
代码:
sqstack.h:
sqstack.c:
test.c:
运行结果:
三、链式栈的实现
1.创建栈:
插入操作和删除操作均在链表头部进行,链表尾部就是栈底,栈顶指针就是头指针。
typedef int data_t ; /*定义栈中数据元素数据类型*/
typedef struct node_t {
data_t data ; /*数据域*/
struct node_t *next ; /*链接指针域*/
} linkstack_t ; /*链栈类型定义*/
top就是头指针的意思
创建空栈 :
linkstack_t *CreateLinkstack() {
linkstack_t *top;
top = (linkstack_t *)malloc(sizeof(linkstack_t));
top->next = NULL;
return top;
}
判断是否空栈 :
int EmptyStack (linkstack_t *top)
{
return (top->next == NULL ? 1 : 0);
}
2.入栈 :
void PushStack(linkstack_t *top, data_t x)
{
linkstack_t *p ;
p = (linkstack_t *)malloc ( sizeof (linkstack_t) ) ;
p->data = x ;
p->next = top->next;
top->next = p;
return;
}
3.出栈
4.释放空间
代码:
linkstack.h:
linkstack.c:
test.c:
运行结果:
if 0
只进栈没有出栈,从栈顶一个个释放。
if 1
进栈后一个个出栈,所以最后释放的是栈顶(头指针)