已实现的功能:初始化、压栈、遍历、判空、出栈、清空。
本文代码运行环境为Visual Studio Community 2019 16.4.6版本。
代码内容主要来自郝斌老师的课程https://www.bilibili.com/video/av6159200
如有疑问或建议,欢迎留言讨论。
//Stack.cpp
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* pNext;
}NODE,* PNODE;
typedef struct Stack {
PNODE pTop;
PNODE pBottom;
}STACK,* PSTACK;
//声明
void init_stack(PSTACK pS);//初始化一个空栈
void push_stack(PSTACK pS, int val);//压栈
void traverse_stack(PSTACK pS);//遍历输出所有结点
bool is_empty_stack(PSTACK pS);//判空
void pop_stack(PSTACK pS);//出栈
void clear_stack(PSTACK pS);//清空栈
int main() {
STACK S;
init_stack(&S);
push_stack(&S, 1);
push_stack(&S, 2);
push_stack(&S, 3);
push_stack(&S, 4);
push_stack(&S, 5);
traverse_stack(&S);
pop_stack(&S);
pop_stack(&S);
pop_stack(&S);
pop_stack(&S);
pop_stack(&S);
pop_stack(&S);
clear_stack(&S);
return 0;
}
void init_stack(PSTACK pS) {
pS->pTop = (PNODE)malloc(sizeof(NODE));
if (pS->pTop == NULL) {
printf("动态内存分配失败!\n");
exit(-1);
}
else {
pS->pBottom = pS->pTop;
pS->pTop->data = NULL;
}
}
void push_stack(PSTACK pS, int val) {
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (pNew == NULL) {
printf("动态内存分配失败!\n");
exit(-1);
}
else {
pNew->data = val;
pNew->pNext = pS->pTop;//不能是pBottom,要考虑后面新入栈的结点都要指向栈顶。
pS->pTop = pNew;
}
}
void traverse_stack(PSTACK pS) {
PNODE p = pS->pTop;
while (p != pS->pBottom) {
printf("%d ", p->data);
p = p->pNext;
}
printf("\n");
}
bool is_empty_stack(PSTACK pS) {
if (pS->pTop == pS->pBottom) {
return true;
}
else {
return false;
}
}
void pop_stack(PSTACK pS) {
if (is_empty_stack(pS)) {
printf("出栈失败,这是个空栈!\n");
return;
}
else {
PNODE r = pS->pTop;
int val = r->data;
printf("出栈:%d\n", val);
pS->pTop = r->pNext;
free(r);
r = NULL;
}
}
void clear_stack(PSTACK pS) {
if (is_empty_stack(pS)) {
printf("清空失败,这是个空栈!\n");
return;
}
else {
PNODE p = pS->pTop;
PNODE q = NULL;
while (p != pS->pBottom) {
q = p->pNext;
free(p);
p = q;
}
pS->pTop = pS->pBottom;
}
}