《数据结构与算法分析——C语言描述》第三章 链栈实现(C语言)

链栈:采用链式存储的栈。
特点是入栈出栈操作均在链表表头进行。
优点是不存在栈满上溢的情况,便于多个栈共享存储空间和提高其效率。(后半句没怎么理解)
实现如下(带头结点):

//栈的链式存储——链栈 
#include <stdio.h>
#include <stdlib.h>

#define ElementType int
#define N 10
typedef struct Z{
	ElementType data;
	struct Z *next;
}Stack;

typedef Stack* S;

S make_empty( S ptrs );                 //初始化栈 
int IsEmpty( S ptrs );                 //判断栈是否为空,若为空,返回1,否则返回0 
void push( ElementType x, S ptrs );    //入栈
ElementType pop( S ptrs );             //出栈并返回栈顶元素
ElementType GetTop( S ptrs );          //读取栈顶元素 
int length( S ptrs );                  //求栈长 
int main ( void )
{
	S ptrs;
	
	ptrs = make_empty( ptrs );
	
	int i = 0;
	for( i = 0; i < N; i++ )
		push( i, ptrs );
	
	int len = length( ptrs );
	 
	if( IsEmpty( ptrs ) )
		printf( "栈空\n" );
	else
		printf( "栈不空,有元素%d个\n", len );
	
	S p = ptrs;
	while( p -> next != NULL ){
		printf( "%d ", p -> next -> data );
		p = p -> next;
	}
	printf( "\n" );
	
	ElementType x = pop( ptrs );
	printf( "%d\n", x );
	
	x = GetTop( ptrs );
	printf( "%d", x );
	
	return 0;
} 

S make_empty( S ptrs )
{
	ptrs = ( S )malloc( sizeof( Stack ) );
	if( ptrs == NULL ){
		printf( "请求空间错误\n" );
		exit(0);
	} 
	ptrs -> next = NULL;
}

int IsEmpty( S ptrs )
{
	return ptrs -> next == NULL;
}

void push( ElementType x, S ptrs )
{
	S p;
	p = ( S )malloc( sizeof( Stack )  );
	if( ptrs == NULL ){
		printf( "请求空间错误\n" );
		exit(0);
	}
	p -> data = x;
	p -> next = ptrs -> next;
	ptrs -> next = p;
}

ElementType pop( S ptrs )
{
	if( IsEmpty( ptrs ) ){
		printf( "栈空\n" );
		exit(0);
	}
	ElementType temp = ptrs -> next -> data;
	S p = ptrs -> next;
	ptrs -> next = ptrs -> next -> next;
	free( p );
	return temp;
} 

ElementType GetTop( S ptrs )
{
	if( IsEmpty( ptrs ) ){
		printf( "栈空\n" );
		exit(0);
	}
	return ptrs -> next -> data;
}

int length( S ptrs )
{
	int len = 0;
	while( ptrs -> next != NULL ){
		len++;
		ptrs = ptrs -> next;
	}
	return len;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

房东的小黑

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

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

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

打赏作者

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

抵扣说明:

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

余额充值