C语言专题4——链式栈的一个经典案例

    链式栈是用链表实现的栈的功能,理论上采用“头进头出”更加合理,看一个对有10个元素的链表操作。
//链式栈的程序实现:操作一个空间为10的链式栈  
/*****头函数声明*****/    
#include <stdio.h>  
#include <stdlib.h>  

/*****关键字声明*****/
typedef struct node
{
	int data;//存数据
	struct node * next;//存下一个结点的地址
}linkstack_t;//链式栈中结点的类型

/*****自定义函数声明*****/   
linkstack_t * create_linkstack();                       //1、创建栈
int isnull(linkstack_t * head);              		//2、判断栈空间是否为满  
int push_linkstack(linkstack_t * head, int data);        //3、入栈
int pop_linkstack(linkstack_t * head, int *data);        //4、出栈
int get_linkstack_top(linkstack_t * head, int *data);    //5、获取栈顶数据
int print_linkstack(linkstack_t * head);		//6、打印数据
int clean_linkstack(linkstack_t * head);		//7、清空
int dis_linkstack(linkstack_t * head);			//8、销毁

/*****主函数*****/
int main(int argc, const char *argv[])
{
	linkstack_t * linkstack = create_linkstack();
	if(linkstack == NULL)
	{
		printf("create_linkstack()执行出错\n");
		return -1;
	}
	
	int i;
	for(i = 1; i <= 10; i++)
		push_linkstack(linkstack, i * 10);//调用入栈函数
	print_linkstack(linkstack);

	int data;			        //获取出栈数据
	for(i = 1; i <= 3; i++)
	{
		pop_linkstack(linkstack,&data);	//调用出栈函数
		printf("出栈数据:%d\n", data);	//打印出栈数据
		print_linkstack(linkstack);	//调用打印函数
	}
	int get_top_data;			//获取栈顶数据
	get_linkstack_top(linkstack, &get_top_data);//调用获取栈顶数据的函数
	printf("get_top_data:%d\n", get_top_data);//打印栈顶数据
	
	clean_linkstack(linkstack);		//调用清空
	print_linkstack(linkstack);
	dis_linkstack(linkstack);		//调用销毁
	return 0;
}

/*****函数内容*****/  
linkstack_t * create_linkstack()                  //1、创建栈
{
	linkstack_t * head = malloc(sizeof(linkstack_t));//申请头结点的存储空间
	if(head == NULL)
	{
		printf("空间申请失败!\n");
		return NULL;
	}
	head->next = NULL;			//对头地址初始化
	return head;				//返回申请空间的首地址
}

int isnull(linkstack_t * head)              //2、判断栈空间是否为满
{
	return head->next == NULL;
}

int push_linkstack(linkstack_t * head, int data)//3、入栈
{
	linkstack_t * newnode = malloc(sizeof(linkstack_t));//申请新结点的空间
	newnode->data = data;//存入数据

	newnode->next = head->next;//将新结点连入到链表中
	head->next = newnode;
	return 0;
}

int pop_linkstack(linkstack_t * head, int *data)//4、出栈
{
	if(isnull(head))//判断实施条件
	{
		printf("栈为空,无法执行出栈操作!\n");
		return -1;	
	}
	linkstack_t * temp = head->next;//备份出栈数据
	head->next = temp->next;			//删除出栈数据
	*data = temp->data;				//获取出栈数据
	free(temp);					//释放出栈数据的空间
	return 0;
}

int get_linkstack_top(linkstack_t * head, int *data)//5、获取栈顶数据
{
	if(isnull(head))
	{
		printf("栈为空,无法执行获取栈顶数据的操作!\n");
		return -1;	
	}
	*data = head->next->data;//获取栈顶数据
	return 0;
}

int print_linkstack(linkstack_t * head)//6、打印数据
{
	if(isnull(head))
	{
		printf("栈为空,无法执行打印操作!\n");
		return -1;
	}

	printf("栈顶\n");//打印数据
	while(head->next != NULL)
	{
		head = head->next;
		printf("%d\n",head->data);
	}
	printf("栈底\n");
	return 0;
}

int clean_linkstack(linkstack_t * head)				//7、清空
{
	int temp;
	while(!isnull(head))//只要栈不为空,就执行出栈数据的函数
	{
		pop_linkstack(head, &temp);
	}
	return 0;
}

int dis_linkstack(linkstack_t * head)				//8、销毁
{
	clean_linkstack(head);//调用清空
	free(head);				                //释放头结点的空间
	return 0;
}

猜你喜欢

转载自blog.csdn.net/AQUARICES/article/details/80054558