線性結構的應用--棧
定義:一種可以實現先進後出的存取結構。類似於箱子,往箱子裏面放書,後放的在頂部,可以先拿出來。
分類:
靜態棧:以數組爲內核
動態棧:以鏈表爲內核
應用:函數調用,中斷,表達式求值,內存分配,緩衝處理,走迷宮
#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;
}
}
線性結構_棧
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.