1.栈的概念 first int last out
栈是一种数据逻辑结构,要求先进后出(FILO)
只要符合先进后出的逻辑,那么这种数据结构就叫做栈
栈顶:数据保存到栈里面(入栈)以及出栈操作都必须从栈顶位置开始
栈底:整个栈最开始的位置
2.如何表示栈--》stack
写法一:用顺序表来表示栈 --》顺序栈
struct 顺序栈的名字
{
//数组存放真实数据
int buf[50];
//定义变量标记栈顶位置
int top;
//定义变量标记栈底位置(可选的,可写可不写)
int bottom;
}
写法二:用单链表表示栈 --》链式栈
struct 链式栈的名字
{
//存放真实数据
int data;
//指向栈顶位置的指针
struct 链式栈的名字 *top;
//指向下一个结点的指针
struct 链式栈的名字 *next;
3.顺序栈的实现
栈的初始化
入栈(压栈) --》就是把数据存放到栈里面
出栈(弹栈) --》把数据从栈中取出来,删除
4.链式栈的实现
顺序栈的实现
#include "myhead.h"
//定义一个结构体表示顺序栈
struct seqstack
{
//定义数组存放栈中的元素
int buf[50];
//定义变量标记栈顶位置
int top;
};
//栈的初始化
struct seqstack *stack_init()
{
struct seqstack *stack=malloc(sizeof(struct seqstack));
//初始化栈顶位置
stack->top=-1;
return stack;
}
//入栈 --》把数据存放到栈顶位置 newdata入栈
int push(struct seqstack *stack,int newdata)
{
}
//出栈 --》把数据从栈顶位置取出来,然后删除
int pop(struct seqstack *stack)
{
}
链式栈的实现
#include "myhead.h"
//定义一个结构体表示链式栈
struct liststack
{
//数据域
int data;
//指针标记栈顶位置
struct liststack *top;
//指针域
struct liststack *next;
};
//初始化链式栈
struct liststack *stack_init()
{
struct liststack *stack=malloc(sizeof(struct liststack));
stack->top=NULL;
stack->next=NULL;
return stack;
}
//入栈
int push(struct liststack *stack,int newdata)
{
struct liststack *newnode=malloc(sizeof(struct liststack));
newnode->data=newdata;
newnode->top=NULL;
newnode->next=NULL;
//尾插新结点
struct liststack *p=stack;
while(p->next!=NULL)
p=p->next;
p->next=newnode;
//更新栈顶指针
stack->top=newnode;
return 0;
}
//出栈
int pop(struct liststack *stack)
{
if(stack->next==NULL)
{
printf("此栈已空!\n");
return -1;
}
//备份栈顶位置的数据
int temp=stack->top->data;
//删除栈顶的结点
struct liststack *p=stack;
while(p->next!=stack->top) //循环结束的时候,p指向的栈顶前面一个结点
p=p->next;
p->next=NULL;
free(stack->top);
//更新栈顶位置
stack->top=p;
return temp;
}
int main()
{
//初始化栈
struct liststack *mystack=stack_init();
//入栈4个数据
push(mystack,18);
push(mystack,28);
push(mystack,38);
push(mystack,48);
//出栈4个数据
for(int i=0; i<5; i++)
printf("出栈数据是:%d\n",pop(mystack));
}