线性结构的应用--栈
定义:一种可以实现先进后出的存取结构。类似于箱子,往箱子里面放书,后放的在顶部,可以先拿出来。
分类:
静态栈:以数组为内核
动态栈:以链表为内核
应用:函数调用,中断,表达式求值,内存分配,缓冲处理,走迷宫
#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;
}
}
线性结构_栈
最新推荐文章于 2022-10-16 13:12:21 发布