堆棧的簡單實現之一:基本操作(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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章