線性結構_棧

線性結構的應用--棧
定義:一種可以實現先進後出的存取結構。類似於箱子,往箱子裏面放書,後放的在頂部,可以先拿出來。
分類:
靜態棧:以數組爲內核
動態棧:以鏈表爲內核
應用:函數調用,中斷,表達式求值,內存分配,緩衝處理,走迷宮
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

typedef struct Node {
	int data;
	struct Node* pNext;
}NODE , *PNODE;

typedef struct Stack {
	PNODE pTop;
	PNODE pBottom;
}STACK , *PSTACK;

void initStack(PSTACK);

void pushStack(PSTACK, int);

bool popStack(PSTACK , int *);

void clear(PSTACK);

void traverseStack(PSTACK);

int main() {
	STACK S;
	int val;			//保存出棧元素

	initStack(&S);		//造出一個空棧

	pushStack(&S, 1);	//壓棧

	pushStack(&S, 2);

	pushStack(&S, 3);

	pushStack(&S, 4);

	pushStack(&S, 5);

	traverseStack(&S);

	if (popStack(&S, &val)) {
		printf("出棧成功,出棧的元素是%d\n", val);
	}
	else {
		printf("出棧失敗!");
	}
	traverseStack(&S);

	clear(&S);
	traverseStack(&S);
}

void initStack(PSTACK pS) {
	pS->pTop = (PNODE)malloc(sizeof(NODE));
	if (NULL == pS->pTop) {
		printf("動態分配內存失敗!\n");
		exit(-1);
	}
	else {
		//初始化時,將pTop , pBottom一起指向一個不存放數據的頭節點,並將pTop和pBottom所指向頭節點的指針域清空。
		pS->pBottom = pS->pTop;
		pS->pTop->pNext = NULL;//pS->pBottom->pNext = NULL;
	}
}
void pushStack(PSTACK pS, int val) {
	PNODE pNew = (PNODE)malloc(sizeof(NODE));	//創建新節點
	pNew->data = val;							//將val的值防止到新節點的數據域
	pNew->pNext = pS->pTop;						//將pTop指向新節點的指針域
	pS->pTop = pNew;							//將新的節點放置到pTop

	return;
}


//遍歷過程中,不應該破壞棧的完整性,所以pTop與pBottom均不能移動。遍歷是自上而下的。
void traverseStack(PSTACK pS) {
	PNODE p = pS->pTop;
	while (p != pS->pBottom) {
		printf("%d  ", p->data);
		p = p->pNext;
	}
	printf("\n");
	return;
}

bool empty(PSTACK pS) {
	if (pS->pTop == pS->pBottom) {
		return true;
	}
	else return false;
}

//把pS所指向的棧出棧一次,並把出棧的元素存入pVal形參所指向的變量中,如果出棧失敗,返回false,否則返回true
bool popStack(PSTACK pS , int * pVal) {
	if (empty(pS)) {
		return false;
	}
	else {
		PNODE r = pS->pTop;
		*pVal = r->data;
		pS->pTop = r->pNext;
		free(r);
		r = NULL;
		return true;
	}
}

void clear(PSTACK pS) {
	if (empty(pS)) {
		return;
	}
	else {
		PNODE p = pS->pTop;
		PNODE q = NULL;

		while (p != pS->pBottom) {
			q = p->pNext;
			free(p);
			p = q;
		}
		pS->pTop = pS->pBottom;
	}
}

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