栈的链式结构实现

				/* 2 栈的链式结构实现 */

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

typedef int TYPE;//元素类型别名

//声明顺序栈结构体
typedef struct stack
{
	TYPE data;//存储结点数据
	struct stack* next;//记录后继结点的地址
}stack;

void init(stack**);//初始化

void push(stack**,TYPE);//入栈

TYPE pop(stack**);//出栈

void clear(stack**);//清空

bool isEmpty(stack*);//判断栈是否已满

int length(stack*);//返回栈的元素个数

void ergodic(stack*);//遍历栈中元素

int search(stack*,TYPE);//搜索,返回具栈顶首次出现位置

int main()
{
	stack* top;
	init(&top);

	//入栈测试
	int count=0;//记录入栈元素个数
	printf("输入入栈元素个数:");
	scanf("%d",&count);
	int elem;//记录单个入栈元素
	printf("输入%d个元素:",count);
	while(count)
	{
		scanf("%d",&elem);
		push(&top,elem);
		count--;
	}

	//遍历测试
	printf("遍历栈中元素:");
	ergodic(top);

	scanf("%*[^\n]");
	scanf("%*c");

	//搜索测试
	printf("输入要搜索的元素:");
	scanf("%d",&elem);
	int pos =search(top,elem);
	if(pos)
	{
		printf("查找成功,%d在从栈顶开始第%d个元素\n",elem,pos);
	}
	else
		printf("查找失败!\n");

	//栈长度测试
	count = length(top);
	
	//栈清空测试  栈清空测试与出栈测试不能同时进行
	//clear(&top);
	
	//出栈测试
	printf("栈中有%d个元素\n",count);
	while(count--)
		printf("出栈元素是:%d\n",pop(&top));
	
	//栈长度测试
	printf("栈中有%d个元素\n",length(top));

	return 0;
}

//栈初始化
//因为要更新栈顶指针本身的值,所以要用二级指针
void init(stack** ss)
{
	*ss=NULL;
}

//入栈操作
//因为要更新栈顶指针本身的值,所以要用二级指针
void push(stack** ss,TYPE e)
{
	stack* p=(stack*)malloc(sizeof(struct stack));
	if(p)
	{
		p->data = e;
		p->next=*ss;
		*ss=p;
	}
	else
		printf("内存申请失败,缓冲区将清空!\n");
}

//出栈操作
//因为要更新栈顶指针本身的值,所以用二级指针
TYPE pop(stack** ss)
{
	if(!isEmpty(*ss))//栈不为空
	{
		stack* q=*ss;//记录原来的栈顶指针
		int data=q->data;//获取栈顶元素值
		*ss=(*ss)->next;//更新栈顶指针
		free(q);//销毁原来栈顶元素
		q=NULL;
		return data;
	}
}


//判断是否为空
bool isEmpty(stack* s)
{
	return s==NULL;
}

//返回栈的长度
int length(stack* s)
{
	int count=0;
	while(s)
	{
		s = s->next;
		count++;
	}
	return count;
}


//遍历栈
void ergodic(stack* s)
{
	while(s)
	{
		printf("%d ",s->data);
		s=s->next;
	}
		printf("\n");
}

//搜索栈中元素
//返回元素距离栈顶的位置,如果有多个相同值,则返回首次出现的位置
int search(stack* s,TYPE e)
{
	int pos=0;
	while(s)
	{
		if(s->data==e)
		{
			pos++;
			break;//找到就停止继续寻找
		}
			pos++;
			s=s->next;
	}
	return pos;
}

//清空栈
//因为要更新栈顶指针本身的值,所以要用二级指针
void clear(stack** ss)
{
	while(*ss)
	{
		stack* q=*ss;
		*ss = (*ss)->next;
		free(q);
		q=NULL;
	}
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦时小

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值