栈(三):链式栈


  • 链式栈的存储结构
    typedef int datatype;
    typedef struct link_node{
    	datatype info;
    	struct link_node *next;		//指向下一个结点的link_node指针
    }node;
  • 基本运算实现
    node *init();	//建立一个空的链式栈
    int empty(node *top);	//判断链式栈是否为空
    datatype read(node *top);	//读链式栈的栈顶结点值
    void display(node *top);	//输出链式栈中各个结点的值
    node *push(node *top, datatype x);	//向链式栈插入值为x的结点(进栈)
    node *pop(node* top);	// 删除链式栈的栈顶结点(出栈)
    具体函数实现
    #include "lnkstack.h"
    #include <stdio.h>
    #include <stdlib.h>
    /************************************************************************/
    /* 函数功能: 建立一个空的链式栈  */
    /* 函数参数:   无*/
    /* 函数返回值:  指向node类型变量的指针 */
    /* 文件名: lnkstack.c ,函数名: init()*/
    /************************************************************************/
    node *init()
    {
    	return NULL;
    }
    /************************************************************************/
    /* 函数功能: 判断链式栈是否为空  */
    /* 函数参数:   指向node类型变量的指针top*/
    /* 函数返回值:   int类型的变量,1为空,0为非空*/
    /* 文件名:lnkstack.c ,函数名:empty() */
    /************************************************************************/
    int empty(node *top)
    {
    	return (top?1:0);
    }
    /************************************************************************/
    /* 函数功能:  读链式栈的栈顶结点值 */
    /* 函数参数:  指向node类型变量的指针top */
    /* 函数返回值:  datatype类型的变量 */
    /* 文件名:  lnkstack.c,函数名: read()*/
    /************************************************************************/
    datatype read(node *top)
    {
    	if (!top)	//链式栈是空的
    	{
    		printf("\n链式栈是空的!");
    		exit(1);
    	}
    	return (top->info);
    }
    /************************************************************************/
    /* 函数功能:  输出链式栈中各个结点的值 */
    /* 函数参数:   指向node类型变量的指针top*/
    /* 函数返回值:  空 */
    /* 文件名: lnkstack.c ,函数名:display() */
    /************************************************************************/
    void display(node *top)
    {
    	node *p;
    	p=top;
    	if (!p)
    	{
    		printf("\n链式栈是空的!");
    	}
    	else
    	{
    		puts("链式栈中的元素为:");
    	}	
    	while (p)
    	{
    		printf("%5d",p->info);
    		p=p->next;
    	}
    	printf("\n");
    }
    /************************************************************************/
    /* 函数功能:  向链式栈插入值为x的结点(进栈) */
    /* 函数参数:  指向node类型变量的指针top ,datatpye类型变量x*/
    /* 函数返回值:  指向node类型变量的指针 */
    /* 文件名:lnkstack.c  ,函数名: push()*/
    /************************************************************************/
    node *push(node *top, datatype x)
    {
    	node *p;
    	p=(node*)malloc(sizeof(node));
    	p->info=x;
    	p->next=top;
    	top=p;
    	return top;
    }
    /************************************************************************/
    /* 函数功能:  删除链式栈的栈顶结点(出栈) */
    /* 函数参数:   指向node类型变量的指针top*/
    /* 函数返回值:  指向node类型变量的指针 */
    /* 文件名: lnkstack.c ,函数名: pop()*/
    /************************************************************************/
    node *pop(node* top)
    {
    	node *q;
    	if (!top)
    	{
    		printf("\n链式栈是空的!");
    		return NULL;
    	}
    	q=top;
    	top=top->next;
    	free(q);
    	return top;
    }
  • main函数
    #include <stdio.h>
    #include <stdlib.h>
    #include "lnkstack.h"
    
    void main(void)
    {
    	node *p_lnkstack;
    	//初始化链栈
    	p_lnkstack = init();
    
    	int choosecase = 0;
    	int x;
    	puts("进栈请输入0,出栈请输入1");
    	while((scanf("%d", &choosecase)) == 1)
    	{
    		switch (choosecase)
    		{
    		case 0:
    			puts("输入进栈元素x");
    			scanf("%d", &x);
    			p_lnkstack = push(p_lnkstack, x);
    			display(p_lnkstack);
    			break;
    		case 1:
    			printf("出栈的元素为%d\n",read(p_lnkstack));
    			p_lnkstack = pop(p_lnkstack);
    			display(p_lnkstack);
    			break;
    		default:
    			break;
    		}
    		puts("进栈请输入0,出栈请输入1");
    	}
    	system("pause");
    }
  • 运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值