数据结构之栈

本文介绍了栈的基本概念及其两种主要实现方式:顺序栈和链式栈。通过具体的代码示例展示了如何进行初始化、判断空满状态、入栈、获取栈顶元素及清空等基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)栈:其特点是数据遵循“先进后出”的原则,是一个由低地址向高地址增长的。

(2)分类:定长顺序栈、不定长顺序栈、链式栈

(3)代码如下:

#define SIZE 10
typedef int ElemType;
typedef struct Stack
{
	ElemType elem[SIZE];
	int top;//栈顶指针,标记当前可以存放数据的下标
}Stack,*PStack;


//初始化
void Init_Stack(PStack ps)
{
	assert(ps!=NULL);
	ps->top=0;
}
//判空
bool IsEmpty(PStack ps)
{
	return ps->top == 0;
}
//判满
static bool IsFull(PStack ps)
{
	return ps->top == SIZE;
}
//入栈
bool push(PStack ps,int val)
{
	if(IsFull(ps))
	{
		return false;
	}
	ps->elem[ps->top++]=val;
	return true;
}

//获取栈顶元素的值,但不删除
bool top(PStack ps,int *rtval)
{
	if(IsEmpty(ps))
	{
		return false;
	}
	*rtval=ps->elem[ps->top-1];//top可以存放数据的下标 所以需要减一
	return true;
}

//获取栈顶元素的值,且删除
bool pop(PStack ps,int *rtval)
{
	if(IsEmpty(ps))
	{
		return false;
	}
	*rtval=ps->elem[--ps->top];
	return true;
}
//清空
void Clear(PStack ps)
{
	ps->top = 0;
}


int main()
{
	Stack ps;
	Init_Stack(&ps);


	for(int i=0;i<10;i++)
	{
		push(&ps,i);
	}
	int tmp;
	while(!IsEmpty(&ps))
	{
		pop(&ps,&tmp);
		printf("%d ",tmp);
	}
	printf("\n");
	//Show(&st);
	return 0;
}*/
/*
链式栈 与单链表相同,在操作时用到的都是单链表的操作;
*/

/*
typedef struct SNode
{
	int data;
	struct SNode *next;//链式栈的栈顶在表头
}SNode,*SStack;


void InitStack(SStack ps)
{
	assert(ps!=NULL);

	ps->next=NULL;
}

//入栈-头插
bool Push(SStack ps,int val)
{
	assert(ps!=NULL);
	if(ps==NULL)
	{
		return false;
	}

	SNode *p=(SNode*)malloc(sizeof(SNode));
	p->data=val;

	p->next=ps->next;
	ps->next=p;

	return true;
}

//入栈-尾插
bool push(SStack ps,int val)
{
	assert(ps!=NULL);
	if(ps==NULL)
	{
		return false;
	}
	SNode *p;
	for(p=ps;p->next!=NULL;p=p->next);
	SNode *q=(SNode *)malloc(sizeof(SNode));

	q->data=val;
	q->next=p->next;
	p->next=q;
	return true;
}

bool IsEmpty(SStack ps)
{
	return ps->next==NULL;
}

//获取栈顶元素的值,但不删除
bool top(SStack ps,int *rtval)
{
	if(IsEmpty(ps))
	{
		return false;
	}

	return  *rtval=ps->next->data;
}

//获取栈顶元素的值,且删除
bool pop(SStack ps,int *rtval)
{
	if(IsEmpty(ps))
	{
		return false;
	}

	SNode *p = ps->next;
	//头结点指向当前节点的下一个
	ps->next = p->next;
	//得到元素后并且删除此节点
	*rtval = p->data;
	free(p);//释放当前节点
	return true;
}
//销毁栈 就是单链表的现货
void Destroy(SStack ps)
{
	SNode *p;
	while(ps->next)
	{
		p=ps->next;
		ps->next=p->next;
		free(p);
	}
}
void Clear(SStack ps)
{
	Destroy(ps);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值