1. 程式人生 > >用C語言實現棧以及棧的簡單操作

用C語言實現棧以及棧的簡單操作

一   棧的定義:

棧(堆疊)是一種線性表,它的特點是僅允許在棧的一端進行插入、刪除等操作。棧底固定,棧頂浮動。其特性為後進先出。一般棧中元素為0時,稱為空棧。它有兩種實現方式,順序棧與鏈棧,下面將簡單的說明一下順序棧及鏈棧的生成與簡單操作。

棧的簡單操作如圖所示:(top從0到3的改變體現著入棧與出棧)

二   順序棧:

順序棧:靜態棧,以順序表的方式實現棧以及棧的簡單操作。順序棧的模型為:

順序棧的見到操作的具體程式碼如下所示:

標頭檔案:

#include<stdio.h>
#include<assert.h>
#include<windows.h>

typedef int SDataType;

typedef struct Stack {
	SDataType array[100];
	int top;
	//此處的array[top]表示下一個可用位置
	//此處的array[top-1]表示棧頂元素位置
	//top表示棧裡現在有多少資料
} Stack;

// 初始化 
Stack* StackInit(Stack *pStack);

// 壓棧 
void StackPush(Stack *pStack, SDataType data);

// 出棧 
void StackPop(Stack *pStack);

// 返回棧頂元素 
SDataType StackTop(Stack *pStack);

// 判斷是否為空 
// 1 空 
// 0 不空 
int StackIsEmpty(Stack *pStack);

// 返回資料個數 
int StackSize(Stack *pStack);
//列印棧
void StackPrint(Stack *pStack);


// 初始化 
Stack* StackInit(Stack *pStack)
{
	//Stack * pStack1 = (Stack *)malloc(sizeof(Stack));
	//assert(pStack1 != NULL);//確定棧建立成功,如果pStack == NULL,整個程式直接退出
	pStack->top = 0;//棧裡的資料個數為0
	return pStack;
}

// 壓棧 
// 壓棧就是讓棧頂元素等於所要入棧的元素,再讓top++;(前提條件是棧未滿)
void StackPush(Stack *pStack, SDataType data)
{
	assert(pStack != NULL);
	assert(pStack->top < 100);
	pStack->array[pStack->top] = data;
	pStack->top++;
}

// 出棧 
// 出棧的前提是棧裡有元素,然後只需要讓棧頂指標減減
void StackPop(Stack *pStack)
{
	assert(pStack != NULL);
	assert(pStack->top >0);
	pStack->top--;
}

// 返回棧頂元素 
// 前提是棧中有元素,需要將棧頂指標減減
int StackTop(Stack *pStack)
{
	assert(pStack != NULL);
	assert(pStack->top > 0);
	pStack->top--;
	return(pStack->array[pStack->top]);
}

// 判斷是否為空 
// 1 空 
// 0 不空 
int StackIsEmpty(Stack *pStack)
{
	assert(pStack != NULL);
	if (pStack->top == 0)
		return 1;
	else
		return 0;
}

// 返回資料個數 
int StackSize(Stack *pStack)
{
	assert(pStack != NULL);
	pStack->top++;
	return (pStack->top);
}
//列印棧
void StackPrint(Stack *pStack)
{
	int i = pStack->top;
	while (i != 0)
	{
		printf("%d ", pStack->array[i-1]);
		i--;
	}
	printf("\n");
}

.c檔案:

#include"stack.h"
void test()
{
	Stack pStack1;
	StackInit(&pStack1);
	StackInit(&pStack2);
	StackPush(&pStack1,1);
	StackPush(&pStack1,3);
	StackPush(&pStack1,5);
	StackPush(&pStack1,7);
	StackPrint(&pStack1);
	
	StackPop(&pStack1);
	StackPop(&pStack1);
	StackPrint(&pStack1);

	int p = StackTop(&pStack1);
	printf("棧頂元素為:%d\n", p);

	int p1 = StackIsEmpty(&pStack1);
	printf("%d\n", p1);

	int p2 = StackSize(&pStack1);
	printf("棧內有%d個元素\n", p2);


}
int main()
{
	test();
        system("pause");
	return 0;
}

關於棧的一些內容,若有不對,還請指正。