S=(a1,a2,a3,a4,a5,,,,,,,,,,,,,)
允许插入和操作的一端叫 栈顶。
表达另一端称为栈底。
当栈中没有数据元素称为空栈。
栈的插入操作通常叫进栈。
定义:只能在表达一端(栈顶)进行插入和删除运算的线性表。
逻辑结构:与线性表相同,仍为一对一关系。
存储结构:用顺序栈或链式栈存储均可,但以顺序栈常见。
运算原则:只能在栈顶运算,且访问结点时依照后进先出的原则
实现方式:关键是编写入栈和出栈函数,具体实现依顺序栈或链式栈顶不同而不同
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}stack;
stack *init_list(void) //初始化
{
stack *p=NULL;
p=(stack *)malloc(sizeof(stack));
p->data=0;
p->next=NULL;
return p;
}
void push(stack *l,int data) //入栈
{
stack *p=(stack *)malloc(sizeof(stack));
p->data=data;
p->next=l->next;
l->next=p;
l->data++;
}
int is_empty(stack *l) //栈空
{
if(l->data==0 || l->next==NULL)
{
return 1;
}
else
return 0;
}
int pop(stack *l)//出栈
{
if(is_empty(l))
return -1;
else
{
stack *node=l->next;
int data=0;
data =node->data;
l->next=node->next;
l->data--;
free(node);
return data;
}
}
void print(stack *l)//函数打印链表
{
stack *p=NULL;
p=l->next;
while(p!=NULL)
{
printf("%d->",p->data);
p=p->next;
}
printf("NULL\n");
}
int main()//主函数
{
stack *l=NULL;
l=init_list();
push(l,1);
push(l,2);
push(l,3);
print(l);
int i=0;
i=pop(l);
printf("data=%d\n",i);
print(l);
free(l);
return 0;
}