(二)数据结构之线性表的简单实现:堆栈

本文详细介绍了堆栈的概念,它是一种仅允许在表的一端(栈顶)进行插入和删除操作的线性表。文章分别探讨了栈的顺序存储和链式存储实现,包括创建空栈、压栈、出栈的操作,并提供了完整的示例代码。

1、堆栈的定义

具有一定操作约束的线性表,只在一端(栈顶,Top)做插入、删除操作。堆栈的基本操作主要有两类:a、插入数据:入栈(Push);b、删除数据:出栈(Pop)。

2、栈的顺序存储实现

2.1 栈的基本数据结构

/* 定义堆栈的数据结构 */
#define MaxSize		10
typedef int ElementType;
typedef struct _Stack{
	ElementType Data[MaxSize];
	int Top;
} Stack;

2.2 创建一个空栈

/* 创建一个堆栈 */
Stack *CreateStack()
{
	Stack *S = (Stack*)malloc(sizeof(Stack));
	if(NULL != S) S->Top = -1;
	return S;
}

2.3 压栈操作

/* 压栈操作,先移动Top,后压入 */
void Push( Stack *PtrS, ElementType item )
{
	if (IsFull(PtrS))	// 判断是否栈满 
	{
		printf("Stack is full!\n"); 
		return;
	}
	else 
	{
		PtrS->Data[++(PtrS->Top)] = item;
		return;
	}
}

2.4 出栈操作

/* 出栈操作,先弹出,后移动Top */
ElementType Pop( Stack *PtrS )
{
	if (IsEmpty(PtrS)) 		// 判断堆栈是否为空
	{
		printf("The stack is empty!\n");
		return -1; 
	} 
	else
		return ( PtrS->Data[(PtrS->Top)--] );
}

2.5 完整示例代码

/* 顺序存储堆栈的实现 */
#include <stdio.h>
#include <stdlib.h>

/* 定义堆栈的数据结构 */
#define MaxSize		10
typedef int ElementType;
typedef struct _Stack{
	ElementType Data[MaxSize];
	int Top;
} Stack;

/* 创建一个堆栈 */
Stack *CreateStack()
{
	Stack *S = (Stack*)malloc(sizeof(Stack));
	if(NULL != S) S->Top = -1;
	return S;
}

/* 销毁一个堆栈 */
void DestroyStack(Stack *PtrS)
{
	if(NULL != PtrS)
	{
		free(PtrS);
		PtrS = NULL;
	}
}

/* 判断一个堆栈是否为空,为空返回1,否者返回0 */
int IsEmpty( Stack *S )
{
	return (S->Top == -1);
}

/* 判断一个堆栈是否为满, 为满返回1,否者返回0 */
int IsFull( Stack *S )
{
	return (S->Top == MaxSize - 1);
}

/* 压栈操作,先移动Top,后压入 */
void Push( Stack *PtrS, ElementType item )
{
	if (IsFull(PtrS))	// 判断是否栈满 
	{
		printf("Stack is full!\n"); 
		return;
	}
	else 
	{
		PtrS->Data[++(PtrS->Top)] = item;
		return;
	}
}

/* 出栈操作,先弹出,后移动Top */
ElementType Pop( Stack *PtrS )
{
	if (IsEmpty(PtrS)) 		// 判断堆栈是否为空
	{
		printf("The stack is empty!\n");
		return -1; 
	} 
	else
		return ( PtrS->Data[(PtrS->Top)--] );
}

/* 遍历一个堆栈 */
void Traversal( Stack *PtrS )
{
	int i = 0;
	if(!IsEmpty(PtrS))
	{
		for(i = PtrS->Top; i >= 0; i--)
			printf("%d ", PtrS->Data[i]);
		printf("\n");
	}
}

/* 程序入口 */
int main()
{
	int i = 0;
	ElementType temp;
	Stack *stack = NULL;

	/* 创建一个堆栈 */
	stack = CreateStack();
	if(NULL == stack)
	{
		printf("Create stack is failed!\n");
		return -1;
	}

	/* 向堆栈中压入五个元素 */
	printf("Input 5 numbers : ");
	for(i = 0; i < 5; i++)
	{
		scanf("%d", &temp);
		Push(stack, temp);
	}

	printf("*************************************Traversal********************************\n");
	Traversal(stack);

	printf("*************************************Push*************************************\n");
	printf("Input 1 number : ");
	scanf("%d", &temp);
	Push(stack, temp);
	Traversal(stack);

	printf("*************************************Pop twice********************************\n");
	Pop(stack);
	Pop(stack);
	Traversal(stack);

	DestroyStack(stack);	// 销毁一个堆栈

	return 0;
}

3、栈的链式存储实现

3.1 基本数据结构

/* 定义堆栈的数据结构 */
typedef int ElementType;
typedef struct Node{
	ElementType Data;
	struct Node *Next;
} LinkStack;

3.2 创建空栈

/** 创建一个空堆栈
  *		给它分配一个头结点,这样做的目的是为了更好的操作这个堆栈更方面找到堆栈的栈顶
  */
LinkStack *CreateStack()
{ 
	/* 构建一个堆栈的头结点,返回指针 */
	LinkStack *S;
	S = malloc( sizeof(struct Node ));
	if(NULL != S)
		S->Next = NULL;
	return S;
}

3.3 压栈操作

/* 压栈操作,进行结点插入 */
void Push( ElementType item, LinkStack *S )
{ 
	/* 将元素item压入堆栈S */
	struct Node *TmpCell;
	TmpCell = malloc( sizeof( struct Node ) );
	TmpCell->Data = item;
	TmpCell->Next = S->Next;
	S->Next = TmpCell;
}

3.4 出栈操作

/* 出栈操作,删除结点 */
ElementType Pop( LinkStack *S )
{ 
	/* 删除并返回堆栈S的栈顶元素 */
	struct Node *FirstCell;
	ElementType TopElem;
	if( IsEmpty( S ) ) 
	{
		printf("The link stack is empty!\n"); return -1;
	}
	else 
	{
		FirstCell = S->Next;
		S->Next = FirstCell->Next;
		TopElem = FirstCell->Data;
		free(FirstCell);
		FirstCell = NULL;	/* 防止野指针 */
		return TopElem;
	}
}

3.5 完整代码实现

/* 链式存储的堆栈的实现 */
#include <stdio.h>
#include <stdlib.h>

/* 定义堆栈的数据结构 */
typedef int ElementType;
typedef struct Node{
	ElementType Data;
	struct Node *Next;
} LinkStack;

/** 创建一个空堆栈
  *		给它分配一个头结点,这样做的目的是为了更好的操作这个堆栈更方面找到堆栈的栈顶
  */
LinkStack *CreateStack()
{ 
	/* 构建一个堆栈的头结点,返回指针 */
	LinkStack *S;
	S = malloc( sizeof(struct Node ));
	if(NULL != S)
		S->Next = NULL;
	return S;
}

/* 销毁一个堆栈 */
void DestroyStack(LinkStack *S)
{	
	LinkStack *Temp = S->Next;	// 先释放栈内结点
	LinkStack *Next;
	while(Temp)
	{
		Next = Temp->Next;
		free(Temp);
		Temp = Next;
	}
	S->Next = NULL;
}

/* 销毁一个堆栈 */
void DestroyStackHead(LinkStack *S)
{
	if(NULL != S)
	{
		free(S);
		S = NULL;
	}
}
 
/* 判断堆栈S是否为空,若为空函数返回整数1,否则返回0 */
int IsEmpty( LinkStack *S )
{ 
	return ( S->Next == NULL );
}

/* 压栈操作,进行结点插入 */
void Push( ElementType item, LinkStack *S )
{ 
	/* 将元素item压入堆栈S */
	struct Node *TmpCell;
	TmpCell = malloc( sizeof( struct Node ) );
	TmpCell->Data = item;
	TmpCell->Next = S->Next;
	S->Next = TmpCell;
}

/* 出栈操作,删除结点 */
ElementType Pop( LinkStack *S )
{ 
	/* 删除并返回堆栈S的栈顶元素 */
	struct Node *FirstCell;
	ElementType TopElem;
	if( IsEmpty( S ) ) 
	{
		printf("The link stack is empty!\n"); return -1;
	}
	else 
	{
		FirstCell = S->Next;
		S->Next = FirstCell->Next;
		TopElem = FirstCell->Data;
		free(FirstCell);
		FirstCell = NULL;	/* 防止野指针 */
		return TopElem;
	}
}

/* 遍历一个堆栈 */
void Traversal( LinkStack *S )
{
	struct Node *TmpCell;
	if(!IsEmpty( S ))
	{
		TmpCell = S->Next;
		while(TmpCell)
		{
			printf("%d ", TmpCell->Data);
			TmpCell = TmpCell->Next;
		}
		printf("\n");
	}
}


/* 程序的入口 */
int main()
{
	int i = 0;
	ElementType temp;
	LinkStack *stack = NULL;

	/* 创建一个堆栈 */
	stack = CreateStack();
	if(NULL == stack)
	{
		printf("Create link stack is failed!\n");
		return -1;
	}

	/* 向堆栈中压入五个元素 */
	printf("Input 5 numbers : ");
	for(i = 0; i < 5; i++)
	{
		scanf("%d", &temp);
		Push(temp, stack);
	}

	printf("*************************************Traversal********************************\n");
	Traversal(stack);

	printf("*************************************Push*************************************\n");
	printf("Input 1 number : ");
	scanf("%d", &temp);
	Push(temp, stack);
	Traversal(stack);

	printf("*************************************Pop twice********************************\n");
	Pop(stack);
	Pop(stack);
	Traversal(stack);

	DestroyStack(stack);		// 销毁一个堆栈
	DestroyStackHead(stack);	// 销毁链表头

	return 0;	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值