堆棧(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;
}