【数据结构】-链栈操作(接上)

一、链栈概述

 链栈是栈的链式存储,是特殊的链表。

链栈操作都是在链表的一端实现的:

        ①如果在链表尾操作,在每一次入栈和出栈都需要找到链表的尾结点,导致效率较低;

        ②把链表的头结点作为栈顶结点,入栈就采用头部插入法,出栈采用尾部插入结点。

特殊:链栈的每一个结点都包含数据域和指针域:

typedef struct node{
	data_t data;//栈元素结点数据域
	struct node *next;//指针域
}node_t;

二、相关操作

common.h

#ifndef _COMM0N_H_
#define _COMMON_H_

//栈数据类型定义
typedef int data_t;

typedef struct node{
	data_t data;//栈元素结点数据域
	struct node *next;//指针域
}node_t;

node_t *CreateLinkStack(void);//栈顶结点初始化
int pushLinkStack(node_t *top, data_t mydata);//入栈
int GetLinkStack(node_t *top, data_t *mydata);//获得栈顶元素
int PopLinkStack(node_t *top);//出栈

#endif

linkstack.c

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

#include "common.h"
//栈顶结点初始化
node_t *CreateLinkStack(void)
{
	node_t *top;
	//分配空间
	top = malloc(sizeof(node_t));
	//创建失败
	if(top == NULL)
		return NULL;
	top->next = NULL;
	return top;
}
//入栈
int pushLinkStack(node_t *top, data_t mydata)
{
	node_t *q;//入栈元素为q

	if(top == NULL)
		return -1;
	//入栈结点分配空间
	q = malloc(sizeof(node_t));
	if(q == NULL)
		return -1;
	q->data = mydata;
	//入栈
	q->next = top->next;
	top->next = q;

	return 0;
}
//获得栈顶元素
int GetLinkStack(node_t *top, data_t *mydata)
{
	if(top == NULL)
		return -1;
	if(top->next == NULL)//空栈
		return -1;
	*mydata = top->next->data;

	return 0;
}
//出栈
int PopLinkStack(node_t *top)
{
	node_t *p;

	if(top == NULL)
		return -1;
	if(top->next == NULL)
		return -1;
	//出栈操作
	p = top->next;
	top->next = p->next;

	free(p);//释放

	return 0;
}

app.c

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

#include "common.h"
int main()
{
	int i;
	node_t *top;
	data_t mydata;

	top = CreateLinkStack();
	if(top == NULL)
		return -1;
	i = 20;
	while(i)
	{
		if(pushLinkStack(top,i--)==-1)
		{
			printf("%d push fail\n",i);
		}
	}
	while(GetLinkStack(top, &mydata) == 0)
       	{
		printf("Pop : %d\n", mydata);
		PopLinkStack(top);
	}
	return 0;
}

三、编译运行结果

如想看顺序栈,可点击:顺序栈的介绍和相关操作 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值