数据结构学习笔录--堆栈的实现

本文详细介绍了堆栈的顺序存储和链式存储实现方式,包括数据结构定义、基本操作实现及具体代码实例。

和队列一样,堆栈也是一个对操作有一定约束的线性表,进栈时只能在一端进行,出栈在另一端进行。就如同一叠盘子,先放的最后拿出来,最后放的最先拿出来,具有先入后出的特征。下面是堆栈的顺序存储实现和链式存储实现。

1、堆栈的顺序存储实现

(1)数据结构

typedef struct Stack{
	int Data[MAXSIZE];
	int top;
}stack;

(2)一般操作

bool isFull(stack *s); --判断堆栈是否满
bool isEmpty(stack *s); --判断堆栈是否为空
stack* createStack();  --创建一个堆栈
void Push(stack *s,int elem);  --将元素入栈
int Pop(stack *s);  --出栈


(3)具体实现

bool isFull(stack *s)
{
	if(s->top==MAXSIZE)
		return true;
	else
		return false;
}

bool isEmpty(stack *s)
{
	if(s->top==-1)
		return true;
	else
		return false;
}

stack* createStack()
{
	stack *s;
	s=(stack*)malloc(sizeof(stack));
	s->top=-1;
	return s;
}
void Push(stack *s,int elem)
{
	int i=s->top;
	if(!isFull(s))
	{	
		s->Data[i+1]=elem;
		s->top+=1;
	}
	else
	{
		printf("no enough space to push\n");
	}
}
int Pop(stack *s)
{
	if(isEmpty(s))
	{
		printf("no element in stack");
	}
	else
	{
		int i=s->top;
		s->top-=1;
		return s->Data[i];
	}
	return 0;
}
int main()
{
	stack *s=createStack();
	int i;
	for(i=0;i<10;i++)
	Push(s,i);
	
	for(i=0;i<=s->top;i++)
	printf("data=%d,top=%d\n",s->Data[i],s->top);
	int p;
	while(s->top)
	{
		p=Pop(s);
		printf("pop=%d,top=%d\n",p,s->top);
	}
	return 0;
}

2、堆栈的链式存储

(1)数据结构

typedef struct Node{
	int data;
	struct Node* next;
}stack;

(2)一般操作

bool isEmpty(stack *s); --判断堆栈是否为空
stack* createStack();  --创建一个堆栈
void Push(stack *s,int elem);  --将元素入栈
int Pop(stack *s);  --出栈

(3)具体实现

bool isEmpty(stack *s)
{
	if(s->next==NULL)
		return true;
	else
		return false;
}

stack* createStack()
{
	stack *s;
	s=(stack*)malloc(sizeof(stack));
	s->next=NULL;
	return s;
}

void Push(stack *s,int elem)
{
	stack *q;
	q=(stack*)malloc(sizeof(stack));
	q->data=elem;
	q->next=s->next;
	s->next=q;
}
int Pop(stack *s)
{	
	stack *p;
	int i;
	if(!isEmpty(s))
	{
		p=s->next;
		s->next=p->next;
		i=p->data;
		free(p);
		return i;
	}
	else
	{
		printf("the stack is empty\n");
	}
}
int main()
{	
	int i;
	stack *s=createStack();
	printf("进栈顺序:\n");
	for(i=0;i<10;i++)
	{
		printf("%d ",i);
		Push(s,i);
	}
	printf("\n出栈顺序:\n");	
	for(i=0;i<10;i++)
	{
		int ret=Pop(s);
		printf("%d ",ret);	
	}
		
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值