1. 程式人生 > >順序棧的概念,初始化,回收,入棧,出棧,返回棧頂,遍歷

順序棧的概念,初始化,回收,入棧,出棧,返回棧頂,遍歷

/*棧,是限定在僅在隊尾進行插入或刪除操作的線性表,因此對於棧來說,表尾端有其特殊含義,稱為棧頂
相應地,表頭端稱為棧底。不含元素的空表稱為空棧。
(限定只能在一端(棧頂)進行操作(入棧和出棧)的線性表,稱之為棧)
S=(a1,a2,a3---,an)---a1成為棧底,an稱為棧頂
棧的特點是:
1. 它是一個線性表
2. 對於這個線性表只能在棧頂進行操作  
*/
/*
順序棧,即棧的順序儲存結構是利用一組地址連續的儲存單元依次存放自棧底到棧頂的資料元素,
同時附設 指標 top 指示棧頂元素在順序棧中的位置

通常的習慣做法是 以top=0 表示空棧,鑑於C語言中的陣列的下標約定從0開始,則當以C做描述語言時,
如此設定會帶來很大的不便;

另一方面,由於棧在使用過程中所需最大空間的大小很難估計,因此,一般來說,在初始化設空棧時不應設定棧的最大容量。
一個較合理的做法是:先為棧分配一個基本容量,然後在應用過程中,當棧的空間不夠使用時在逐段擴大。
*/
//棧的用途:函式的呼叫,遞迴的實現,表示式求值
/*算術四則運算具有如下特點:
先出現的運算子有可能要後參與運算           8-2*3
抽象資料特徵--FILO
*/



/*實現的函式:
初始化棧:InitSqStack(Sqstack &stack)
回收棧: DestorySqStack(Sqstack &stack)
入棧: Push(Sqstack &stack,SElemtype e) 
出棧:Pop(Sqstack &stack, SElemtype &e)
(判斷是否為空,是否滿棧)
(top=base;  top-base==size)
獲取棧頂 元素:GetTop(Sqstack stack, SElemtype &e)
遍歷棧: Show(Sqstack stack)
//實現思路
/*
將*base作為(作為線性表的棧)陣列的首指標,從而進行動態分配(其大小表示棧的記憶體大小)
將*top(初始化top=base)來賦值,移動    
*(s->top) = x;     s->top++;
思想:
先為棧分配一個基本容量,然後在應用過程中,當棧的空間不夠使用時在逐段擴大。
*/


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

#define SQ_STACK_INITSIZE 5
#define SQ_STACK_INCREASE 2

typedef int Status;
typedef int SElemtype;
typedef struct stack {
	SElemtype *top;
	SElemtype *base;
	int stacksize;
}Sqstack;
//初始化棧
Status InitSqStack(Sqstack &stack) {
	stack.base = (SElemtype*)malloc(sizeof(SElemtype)*SQ_STACK_INITSIZE);
	if (!stack.base) {
		printf("初始化棧時,base空間分配失敗!\n");
		return ERROR;
	}
	stack.top = stack.base;
	stack.stacksize = SQ_STACK_INITSIZE;
	return TRUE;
}
//回收棧
Status DestorySqStack(Sqstack &stack) {
	if (!stack.base) {
		printf("傳入棧本來就是空的!\n");
		return ERROR;
	}
	else
	{
		free(stack.base);//free調base和top共同所指向的空間
		return TRUE;
	}

}
//入棧
Status Push(Sqstack &stack,SElemtype e) {
	if (stack.top - stack.base == stack.stacksize) {
		
		SElemtype *tem = (SElemtype*)realloc(stack.base, (stack.stacksize + SQ_STACK_INCREASE) * sizeof(SElemtype));
		stack.base = tem;
		stack.stacksize += SQ_STACK_INCREASE;
	}
	*(stack.top) = e;
	stack.top++;
	return TRUE;
}
//出棧
Status Pop(Sqstack &stack, SElemtype &e) {
	if (stack.top == stack.base) {
		printf("出棧時棧已經為空!\n");
		return ERROR;
	}
	stack.top--;
	e = *(stack.top);
	return TRUE;
}
//輸出棧頂元素
Status GetTop(Sqstack stack, SElemtype &e) {
	if (stack.top == stack.base) {
		printf("輸出棧頂元素時,棧為空棧!\n");
		return ERROR;
	}
	stack.top--;
	e= *(stack.top);
	return TRUE;
}
//遍歷棧
Status Show(Sqstack stack) {
	if (stack.top == stack.base) {
		printf("遍歷棧時,棧為空棧!\n");
		return ERROR;
	}
	int Tag=0;
	while (stack.top != stack.base) {
		stack.top--;
		Tag++;
		printf("第%d個被輸出的值:%d\n", Tag, *(stack.top));
	}
	return TRUE;
}

int main() {
	Sqstack stack;
	SElemtype e1=0, e2=0, E1=0, E2=0;
	//初始化棧
	InitSqStack(stack);
	//入棧
	Push(stack, 1);
	Push(stack, 2);
	Push(stack, 3);
	Push(stack, 4);
	Push(stack, 5);
	Push(stack, 6);
	Push(stack, 7);
	Push(stack, 8);
	Push(stack, 9);
	Push(stack, 10);
	//遍歷棧
	Show(stack);
	//輸出棧頂
	GetTop(stack, e1);
	printf("棧頂元素值是:%d\n", e1);
	//出棧
	Pop(stack, E1);
	Pop(stack, E2);
	printf("出棧的元素值是:%d\n", E1);
	printf("出棧的元素值是:%d\n", E2);
	//遍歷棧
	Show(stack);
	//回收棧
	DestorySqStack(stack);
	system("pause");
	return 0;
}