数据结构--栈

栈又名堆栈,是一种受限的数据结构。
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。如图(出入栈模型):
在这里插入图片描述

算法实现

1.进栈(PUSH)算法
①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);
②置TOP=TOP+1(栈指针加1,指向进栈地址);
③S(TOP)=X,结束(X为新进栈的元素);
2.退栈(POP)算法
①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);
②X=S(TOP),(退栈后的元素赋给X):
③TOP=TOP-1,结束(栈指针减1,指向栈顶)。

顺序栈代码实现

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
#define SIZE 100
typedef int data_t;
typedef struct stack{
	data_t data[SIZE];
	int top;  //定义栈顶
}stack;
stack * CreateStack()   //创建一个空栈
{
	stack * s = (stack *)malloc(sizeof(stack));
	if(s == NULL)
		return NULL;
	memset(s->data,0,sizeof(s->data));
	s->top = -1;
	return s;
}
int Stack_is_empty(stack *s)  //判断栈是否为空
{
	if(s == NULL)
		return -1;
	return s->top == -1;
}
int Stack_is_full(stack * s)   //判断栈是否为满
{
	if(s == NULL)
		return -1;
	return s->top == SIZE-1;
}
int PushStack(stack *s,data_t data)  //入栈
{
	if(s == NULL || Stack_is_full(s))
		return -1;
	s->data[s->top+1] = data;
	s->top++;
	return 0;
}
data_t PosStack(stack *s)  //出栈
{
	if(s == NULL || Stack_is_empty(s))
		return -1;
	data_t m = s->data[s->top];
	s->data[s->top] = 0;
	s->top--;
	return m;
}
int ClearStack(stack *s)   //清空栈
{
	if(s == NULL)
		return -1;
	memset(s->data,0,sizeof(s->data));
	s->top = -1;
	return 0;
}
void printStack(stack *s)    //遍历
{
	if(s == NULL)
		return ;
	int num = s->top;
	for(; num >= 0; num--)
		printf("%d ",s->data[num]);
	printf("\n");
	return ;
}
int main()
{
	stack * s = CreateStack();
	int i = 0;
	while(i < 10)
	{
	 PushStack(s,i);
	 i++;
	}
	 printStack(s);
	data_t m = PosStack(s);
	data_t n = PosStack(s);
	data_t x = PosStack(s);
	data_t y = PosStack(s);
	printf("%d %d %d %d\n",m,n,x,y);
	return 0;
}

链式栈代码实现

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
typedef int data_t;
typedef struct node{
	data_t data;
	struct node *next;
}lstack;
lstack *CreateLstack()
{
	lstack * top = (lstack *)malloc(sizeof(lstack));
	if(top == NULL)
		return NULL;
	top->data = -1;
	top->next = NULL;
	return top;
}
int Lstack_is_empty(lstack * top)
{
	if(top == NULL)
		return -1;
	return top->next == NULL;
}
int PushLstack(lstack * top,data_t data)
{
	if(top == NULL)
		return -1;
	lstack * new = (lstack *)malloc(sizeof(lstack));
	if(new == NULL)
		return -1;
	new->data = data;
	new->next = NULL;
	new->next = top->next;
	top->next = new;
	return 0;
}
data_t PosLstack(lstack * top)
{
	if(top == NULL || Lstack_is_empty(top))
		return -1;
	data_t m;
	lstack *p = top->next;
	m = p->data;
	top->next = p->next;
	free(p);
	p = NULL;
	return m;
}
void printLstack(lstack * top)
{
	if(top == NULL)
		return ;
	lstack *p = top->next;
	while(p)
	{
		printf("%d ",p->data);
		p = p->next;
	}
	printf("\n");
	return ;
}
int main()
{
	lstack *ls = CreateLstack();
	int i = 0;
	while(i < 10)
	{
	 PushLstack(ls,i);
	 i++;
	}
	 printLstack(ls);
	data_t m = PosLstack(ls);
	data_t n = PosLstack(ls);
	data_t a  = PosLstack(ls);
	printf("%d %d %d\n",m,n,a);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值