线性表之栈(栈的应用)

栈的定义

·
  1.作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。
  2.按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶
  3.允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈
  4.插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为先进后出表。

线性表之栈(栈的应用)_第1张图片

栈的分类----顺序栈和链栈

栈的操作

顺序栈和链栈的存储方式不同,所以对栈的操作的实现方式也不一样,一般栈有以下几个基本操作。

InitStack(初始化栈)
IsEmpty(是否为空栈)(可省略)
DestroyStack(摧毁栈)
Push(入栈)
Pop(出栈)
GetTop(获取栈顶)

顺序栈

一.写顺序栈需要注意的地方:
1.采用链表存储的栈叫链栈,这里用带头节点单链表实现

2.栈空条件:s->next=NULL;
3.进栈e操作:将含e的节点插入头节点后
4.退栈操作:取出头节点并释放之

typedef struct{
	int data[10];
	int top;			//栈顶指针
}SqStack;

1.初始化顺序栈

void InitStack(SqStack* &s){
	s=(SqStack*)malloc(sizeof(SqStack));
	s->top=-1;
}

2.栈的摧毁

void DestroyStack(SqStack* &s){			//销毁栈
	free(s);
}

3.进栈操作

bool Push(SqStack* &s,int e){			//进栈
	if(s->top==10-1)return false;
	s->top++;
	s->data[s->top]=e;
	return true;
}

4.退栈操作

bool Pop(SqStack* &s,int &e){		//退栈
	if(s->top==-1)return false;
	e=s->data[s->top];
	s->top--;
	return true;
}

5.得到栈顶元素值

bool GetTop(SqStack* &s,int e){
	if(s->top==-1)return false;
	e=s->data[s->top];
	s->top--;
	return true;
}

链栈

二.写链栈需要注意地方
1.采用链表存储的栈叫链栈,这里用带头节点单链表实现

2.栈空条件:s->next=NULL;
3.进栈e操作:将含e的节点插入头节点后
4.退栈操作:取出头节点并释放之

typedef struct Lnode{
	int data;
	struct Lnode* next;
}LiStack;

1.初始化顺序栈

void InitStack(LiStack* &s){
	s=(LiStack*)malloc(sizeof(LiStack));
	s->next=NULL;
}

2.栈的摧毁

void DestroyStack(LiStack* &s){
	LiStack* pre=s,*p=s->next;
	while(p!=NULL){
		free(pre);
		pre=p;
		p=pre->next;
	}
	free(pre);
}		//摧毁栈

3.进栈操作

void Push(LiStack* &s,int e){
	LiStack* p;
	p=(LiStack*)malloc(sizeof(LiStack));
	p->data=e;
	p->next=s->next;
	s->next=p;
}

4.退栈操作

bool Pop(LiStack* &s,int &e){
	LiStack* pre=s,*p=s->next;
	if(s->next==NULL)return false;
	e=p->data;
	pre->next=p->next;
	free(p);
	return true;
}

以上内容如有错误,欢迎大家前来指正

你可能感兴趣的:(数据结构与算法)