堆栈的简单实现之一:基本操作(C语言实现)

堆栈(Stack)是一种操作受限的线性表,堆栈的插入和删除操作只能在一端进行。堆栈遵循着先进后出或者叫后进先出的原则。在堆栈中,允许插入和删除的一端叫着栈顶(Top),另外一端叫着栈底(Bottom)。栈的基本操作包括:栈的初始化,栈的插入和删除,以及判断栈是否为空或者是否为满等。

根据上面所说,来实现一个自己定义的堆栈的基本表示和实现。


1、定义堆栈结构

本文定义的堆栈采用链式存储结构,根据堆栈的特点,定义一个如下的堆栈结构体.

/* 定义堆栈的最大元素个数 */
#define MAX_ITEMS		20
/* 定义一个boolean型枚举类型 */
typedef enum{FALSE, TRUE} boolean;

/* 定义一个表示堆栈的结构体 */
typedef struct
{
	int items[MAX_ITEMS];
	int top;
} Stack;
在这个堆栈结构体中包含一个数组和一个指向数组的索引值,用这个索引值来表示堆栈当前的位置。


2、创建、销毁一个堆栈

创建一个堆栈的具体实现如下:

/* 创建一个堆栈 
 *		返回值 : 返回创建的堆栈结构体地址
 */
Stack *stack_create(void)
{
	Stack *s = malloc(sizeof(Stack));	// 分配一个堆栈空间
	if(NULL == s)	// 分配失败
	{
		return NULL;
	}
	else	// 分配成功
	{
		s->top = 0;
		return s;
	}
}
销毁一个堆栈的具体实现如下:

/*	销毁一个堆栈
 *		s : 要销毁的堆栈的指针的指针
 */
void stack_destroy(Stack **s)
{
	if(NULL != *s)
	{
		free(*s);	// 执行销毁操作
	}
}


3、判断堆栈是否为空、是否为满

判断堆栈是否为空的实现如下:

/*	判断堆栈是否为空函数
 *		s : 表示要判断的堆栈
 *		返回值: TRUE为空,FALSE为非空
 */
boolean stack_empty(Stack *s)
{
	if(s->top == 0) return TRUE;
	else return FALSE;
}
panduan堆栈是否为满的实现如下:

/*	判断堆栈是否为满函数
 *		s : 表示要判断的堆栈
 *		返回值: TRUE表示满,FALSE表示非满
 */
boolean stack_full(Stack *s)
{
	if(s->top == MAX_ITEMS) return TRUE;
	else return FALSE;
}

4、对堆栈进行插入、删除操作

对堆栈进行插入操作,先向指定下标的位置插入堆栈数据,再将堆栈的索引加一,具体的实现如下:

/*	向栈顶插入一个元素
 *		s : 要插入的堆栈
 *		item : 要掺入的元素
 *		返回值: TRUE成功,FALSE失败
 */
boolean stack_push(Stack *s, int item)
{
	if(stack_full(s)) return FALSE;
	else	// 如果堆栈未满
	{
		// 先将元素压入堆栈,然后堆栈指针加一
		s->items[s->top] = item;
		s->top++;
		return TRUE;
	}
}
对堆栈进行删除操作,先将堆栈的索引减一,然后将指定的下标所对应的堆栈数据移除,具体的实现如下:

/*	将栈顶元素弹出
 *		s : 要操作的堆栈
 *		返回值: 返回弹出的值,为0表示弹出失败
 */
int stack_pop(Stack *s)
{
	if(stack_empty(s)) return 0;
	else	// 如果堆栈不为空
	{
		s->top--;
		return s->items[s->top];
	}
}

5、查看堆栈栈顶元素

具体函数实现如下:

/*	获取栈顶元素
 *		s : 要操作的堆栈
 *		返回值 : 返回堆栈元素值,为0表示获取失败
 */
int stack_get_top(Stack *s)
{
	if(stack_empty(s)) return 0;
	else	// 如果不为空,返回堆栈的值
	{
		return s->items[s->top - 1];
	}
}

6、堆栈内容打印函数

通过这个函数可以将堆栈中的数据按照后进先出的顺序给打印出来,具体实现如下:

/*	打印堆栈元素的函数
 *		s : 要打印的堆栈
 */
void stack_print(Stack *s)
{
	int top = s->top;
	
	printf("Stack : ");
	while(top)
	{
		printf("%d ", s->items[--top]);
	}
	printf("\n");
}

7、堆栈测试

通过控制台向堆栈中压入10个数,然后堆栈的基本操作,观察每次操作后数据的输出结果,具体的实现如下:

/* 程序的入口函数 */
int main()
{
	int a[10];
	int i;

	/* 向数组中输入10个数字 */
	printf("Input 10 numbers : \n");
	for(i = 0; i < 10; i++)
	{
		scanf("%d", &a[i]);
	}

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

	Stack *stack = stack_create();	// 创建一个堆栈
	if(NULL == stack)
	{
		printf("stack_create error!\n");
		return -1;
	}

	/* 将10个元素压入堆栈 */
	for(i = 0; i < 10; i++)
	{
		if(stack_push(stack, a[i]) == FALSE)
		{
			printf("stack_push error!\n");
			return -1;
		}
	}

	/* 将压入堆栈的元素显示出来 */
	stack_print(stack);

	/* 向栈顶插入一个元素 */
	stack_push(stack, 128);
	/* 将压入堆栈的元素显示出来 */
	stack_print(stack);

	/* 从栈顶弹出两个元素 */
	stack_pop(stack);
	stack_pop(stack);
	/* 将压入堆栈的元素显示出来 */
	stack_print(stack);
	
	printf("*********************************************************\n");

	/* 打印栈顶元素 */
	printf("the top value is %d.\n", stack_get_top(stack));

	stack_destroy(&stack);	// 销毁一个堆栈
	
	return 0;
}
编译并运行结果如下所示:



附录:本部分完整的程序代码如下

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

/* 定义堆栈的最大元素个数 */
#define MAX_ITEMS		20

/* 定义一个boolean型枚举类型 */
typedef enum{FALSE, TRUE} boolean;

/* 定义一个表示堆栈的结构体 */
typedef struct
{
	int items[MAX_ITEMS];
	int top;
} Stack;

/* 创建一个堆栈 
 *		返回值 : 返回创建的堆栈结构体地址
 */
Stack *stack_create(void)
{
	Stack *s = malloc(sizeof(Stack));	// 分配一个堆栈空间
	if(NULL == s)	// 分配失败
	{
		return NULL;
	}
	else	// 分配成功
	{
		s->top = 0;
		return s;
	}
}

/*	销毁一个堆栈
 *		s : 要销毁的堆栈的指针的指针
 */
void stack_destroy(Stack **s)
{
	if(NULL != *s)
	{
		free(*s);	// 执行销毁操作
	}
}

/*	判断堆栈是否为空函数
 *		s : 表示要判断的堆栈
 *		返回值: TRUE为空,FALSE为非空
 */
boolean stack_empty(Stack *s)
{
	if(s->top == 0) return TRUE;
	else return FALSE;
}

/*	判断堆栈是否为满函数
 *		s : 表示要判断的堆栈
 *		返回值: TRUE表示满,FALSE表示非满
 */
boolean stack_full(Stack *s)
{
	if(s->top == MAX_ITEMS) return TRUE;
	else return FALSE;
}

/*	向栈顶插入一个元素
 *		s : 要插入的堆栈
 *		item : 要掺入的元素
 *		返回值: TRUE成功,FALSE失败
 */
boolean stack_push(Stack *s, int item)
{
	if(stack_full(s)) return FALSE;
	else	// 如果堆栈未满
	{
		// 先将元素压入堆栈,然后堆栈指针加一
		s->items[s->top] = item;
		s->top++;
		return TRUE;
	}
}

/*	将栈顶元素弹出
 *		s : 要操作的堆栈
 *		返回值: 返回弹出的值,为0表示弹出失败
 */
int stack_pop(Stack *s)
{
	if(stack_empty(s)) return 0;
	else	// 如果堆栈不为空
	{
		s->top--;
		return s->items[s->top];
	}
}

/*	获取栈顶元素
 *		s : 要操作的堆栈
 *		返回值 : 返回堆栈元素值,为0表示获取失败
 */
int stack_get_top(Stack *s)
{
	if(stack_empty(s)) return 0;
	else	// 如果不为空,返回堆栈的值
	{
		return s->items[s->top - 1];
	}
}

/*	打印堆栈元素的函数
 *		s : 要打印的堆栈
 */
void stack_print(Stack *s)
{
	int top = s->top;
	
	printf("Stack : ");
	while(top)
	{
		printf("%d ", s->items[--top]);
	}
	printf("\n");
}

/* 程序的入口函数 */
int main()
{
	int a[10];
	int i;

	/* 向数组中输入10个数字 */
	printf("Input 10 numbers : \n");
	for(i = 0; i < 10; i++)
	{
		scanf("%d", &a[i]);
	}

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

	Stack *stack = stack_create();	// 创建一个堆栈
	if(NULL == stack)
	{
		printf("stack_create error!\n");
		return -1;
	}

	/* 将10个元素压入堆栈 */
	for(i = 0; i < 10; i++)
	{
		if(stack_push(stack, a[i]) == FALSE)
		{
			printf("stack_push error!\n");
			return -1;
		}
	}

	/* 将压入堆栈的元素显示出来 */
	stack_print(stack);

	/* 向栈顶插入一个元素 */
	stack_push(stack, 128);
	/* 将压入堆栈的元素显示出来 */
	stack_print(stack);

	/* 从栈顶弹出两个元素 */
	stack_pop(stack);
	stack_pop(stack);
	/* 将压入堆栈的元素显示出来 */
	stack_print(stack);
	
	printf("*********************************************************\n");

	/* 打印栈顶元素 */
	printf("the top value is %d.\n", stack_get_top(stack));

	stack_destroy(&stack);	// 销毁一个堆栈
	
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值