1. 程式人生 > >堆疊的簡單實現之一:基本操作(C語言實現)

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

相關推薦

堆疊簡單實現之一基本操作C語言實現

堆疊(Stack)是一種操作受限的線性表,堆疊的插入和刪除操作只能在一端進行。堆疊遵循著先進後出或者叫後進先出的原則。在堆疊中,允許插入和刪除的一端叫著棧頂(Top),另外一端叫著棧底(Bottom)

學習筆記——單鏈表的基本操作C語言實現

線性表的儲存結構有順序儲存結構(順序表)和鏈式儲存結構(連結串列)兩種。順序表在之前的部落格有介紹過,不明白的朋友可檢視:靜態分配順序表的基本操作及動態分配順序表的基本操作。相對於順序表來說,連結串列稍微難一些,本人花了兩天的時間認真查看了一些資料,終於大致明白了一些東西。現

靜態連結串列基本操作C語言實現詳解

上節,我們初步建立了一個靜態連結串列,本節學習有關靜態連結串列的一些基本操作,包括對錶中資料元素的新增、刪除、查詢和更改。 本節是建立在已能成功建立靜態連結串列的基礎上,因此我們繼續使用上節中已建立好的靜態連結串列學習本節內容,建立好的靜態連結串列如圖 1 所示: 圖 1 建立好的靜態連結串列 靜態

棧的基本操作C語言

概念 一種特殊的線性表,只能在固定的一端進行插入和刪除操作,這個固定的一端稱為棧頂,另外一端稱為棧底,沒有任何元素的棧稱為空棧!! 棧的特性 先進後出或者說後進先出!! 另外,棧分為順序棧以及鏈式棧。 棧的功能 將資料從一種序列改變為另外

資料結構—連結串列的基本操作c語言程式碼

連結串列連結串列也是一種線性表,與順序表不同之處在於不像順序表佔據一段連續的儲存空間,而是將儲存單元分散在記憶體的任意地址上。連結串列結構中,儲存每個資料時候都會把記錄寫在連結串列的一個結點(node)中,每個結點之間由指標相連,形成如同鏈子的結構。結點(node):可以是一

資料結構—順序表基本操作c語言程式碼

順序表計算機內部儲存一張線性表是用一組連續地址記憶體單元,這種儲存結構即為順序儲存結構,這種結構下的線性表叫順序表。順序表有兩種定義方法:                                    1.靜態定義                           

順序表的基本操作C語言實現詳解版

我們學習了順序表及初始化的過程,本節學習有關順序表的一些基本操作,以及如何使用 C 語言實現它們。 順序表插入元素 向已有順序表中插入資料元素,根據插入位置的不同,可分為以下 3 種情況: 插入到順序表的表頭; 在表的中間位置插入元素; 尾隨順序表中已有元素,作為順序表中的最後一個元素; 雖然資

單鏈表基本操作C語言實現鏈式儲存結構

#include<stdio.h> #include<stdlib.h> typedef int DataType; typedef struct Node{ DataType data; struct Node *next; }

隊列的實現操作C語言描述

img tdi 定義數據 上一個 判斷 free 隊列的單鏈表 插入數據 尾指針 // 隊列的單鏈表實現 // 頭節點:哨兵作用,不存放數據,用來初始化隊列時使隊頭隊尾指向的地方 // 首節點:頭節點後第一個節點,存放數據 #include&

資料結構——順序表操作C語言實現

//順序表list #include"stdio.h" #define maxsize 15 typedef struct{ int a[maxsize]; int size; }list; //建立 void create(lis

鏈佇列的基本操作C語言實現

佇列,可以理解為遵循“先進先出”原則的線性表,即資料元素依次從表的一端進,從表的另一端出。 鏈佇列,即用鏈式的儲存結構(連結串列)實現的佇列,其實現思想是:用連結串列的表頭一端表示佇列的隊頭,另一端表示佇列的隊尾(實現程式碼更加簡單)。 反過來的話,當佇列增加元素時,要採用頭插法,在刪除資料元素的時候,需

資料結構——入棧,出棧,佇列相關操作C語言實現

閱讀過程之中可能會花費比較多的時間:建議直接翻到最後,有完整的程式碼可以使用 程式準備工作 #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include<proc

資料結構迴圈佇列C語言實現

生活中有很多佇列的影子,比如打飯排隊,買火車票排隊問題等,可以說與時間相關的問題,一般都會涉及到佇列問題;從生活中,可以抽象出佇列的概念,佇列就是一個能夠實現“先進先出”的儲存結構。佇列分為鏈式佇列和靜態佇列;靜態佇列一般用陣列來實現,但此時的佇列必須是迴圈佇列,否則

連結串列的基本操作C語言詳解

《連結串列及建立》一節我們學習瞭如何使用連結串列儲存資料元素,以及如何使用 C 語言建立連結串列。本節將詳細介紹對連結串列的一些基本操作,包括對連結串列中資料的新增、刪除、查詢(遍歷)和更改。 注意,以下對連結串列的操作實現均建立在已建立好連結串列的基礎上,建立連結串列的程式碼如下所示: //宣告節點結構

單鏈表的基本操作C語言//以整型為例

        單鏈表與陣列相似,但是單鏈表堆記憶體的運用更加的方便,能夠充分的利用零散的記憶體,在中間新增或者刪除一個或多個元素時不需要像陣列一樣移動大量的元素。單鏈表的操作中,涉及到單鏈表元素變化的許耀中指向指標的指標操作。        下面是單鏈表的兩種建立方式以及其

《資料結構與演算法》-單鏈表基本操作C語言實現

最近在學演算法內容,發現很多演算法依賴於基本的資料結構,所以從新溫習資料結構,記錄一下,以後知識點忘記可以提醒自己哪裡比較容易出錯。 所用教材《資料結構與演算法分析》by Mark Allen Weiss 《資料結構》(C語言

表示式計算器逆波蘭法操作C語言實現

可能很多的同學在學資料結構的時候。說到棧,都會有一道很經典的題目,那就是用棧來實現計算器。我們都知道普通的計算寫起來是很簡單的,但是如果涉及到左右括號以及加減乘除組成的運算式的時候則寫起程式時便不那麼容易了。 比如:(1+(2*(1+3)/2)+10)

[answerer的演算法課堂]簡單描述4種排序演算法C語言實現

[answerer的演算法課堂]簡單描述4種排序演算法(C語言實現) 這是我第一次寫文章,想要記錄自己的學習生活,寫得不好請包涵or指導,本來想一口氣寫好多種,後來發現,寫太多的話反而可讀性不強,而且,我文筆,知識有限吶。慢慢來吧 目錄 名稱氣泡排序直接選擇排序直接插入排序希爾排序 時間複雜度 O(

紅黑樹的構建以及插入和刪除操作C語言完整

參照演算法導論虛擬碼。 註釋沒有很詳細,建議先看演算法導論或者其他博主的分析搞清楚insert和delete操作的方法。 #include<stdio.h> #include<stdlib.h> typedef int type; typ

串的基本操作KMP演算法實現

#include <iostream> #include <math.h> using namespace std; void StrAssign(char *T) { char ch; int i=1; cout<<"Please enter a str