目录
这篇文章主要讲栈的顺序表示和实现。
一、什么是链栈
链栈是指采用链式存储结构实现的栈。
链栈的定义如下:
#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACKINCREMENT 10 // 存储空间分配增量
#define ElementType int
typedef int Status;
typedef struct{
ElementType * base;// 栈底指针
ElementType * top; // 栈顶指针
int stacksize; // 栈的当前可以使用的最大容量
}SeqStack;
二、链栈的表示和实现
1.初始化
链栈的初始化操作就是构造一个空栈,因为没必要设头结点,所以直接将栈顶指针置空即可.
// 初始化链栈
Status initLinkStack(LinkStack *linkStack) {
*linkStack = NULL;
return 1;
}
2.销毁
销毁栈中指针
// 销毁链栈
void destroyLinkStack(LinkStack *linkStack) {
LinkStack p = *linkStack;
while (p) {
LinkStack temp = p;
p = p->next;
free(temp);
}
*linkStack = NULL;
}
3.清空
// 清空链栈
void clearLinkStack(LinkStack *linkStack) {
LinkStack p = *linkStack;
while (p) {
LinkStack temp = p;
p = p->next;
free(temp);
}
*linkStack = NULL;
}
4.栈空
// 判断链栈是否为空
Status linkStackEmpty(LinkStack *linkStack) {
return *linkStack == NULL;
}
5.栈长度
// 返回链栈长度
int linkStackLength(LinkStack *linkStack) {
int length = 0;
LinkStack p = *linkStack;
while (p) {
length++;
p = p->next;
}
return length;
}
6.栈顶元素
// 获取栈顶元素
Status getLinkStackTop(LinkStack *linkStack, int *element) {
if (linkStackEmpty(linkStack)) {
return 0;
}
*element = (*linkStack)->data;
return 1;
}
7.入栈
// 入栈
Status pushLinkStack(LinkStack *linkStack, ElementType element) {
LinkStack newNode = (LinkStack)malloc(sizeof(StackNode));
if (!newNode) {
return 0; // 内存分配失败
}
newNode->data = element;
newNode->next = *linkStack;
*linkStack = newNode;
return 1;
}
8.出栈
// 出栈
Status popLinkStack(LinkStack *linkStack, int *element) {
if (linkStackEmpty(linkStack)) {
return 0; // 栈空,无法出栈
}
LinkStack temp = *linkStack;
*element = temp->data;
*linkStack = temp->next;
free(temp);
return 1;
}
8.遍历栈
// 遍历链栈
void traverseLinkStack(LinkStack *linkStack) {
LinkStack p = *linkStack;
while (p) {
printf("%d\t", p->data);
p = p->next;
}
printf("\n");
}
9.测试代码
#include <stdlib.h>
#define ElementType int
typedef int Status;
typedef struct StackNode{
ElementType data;
struct StackNode * next;
}StackNode,*LinkStack;
// 初始化链栈
Status initLinkStack(LinkStack *linkStack) {
*linkStack = NULL;
return 1;
}
// 销毁链栈
void destroyLinkStack(LinkStack *linkStack) {
LinkStack p = *linkStack;
while (p) {
LinkStack temp = p;
p = p->next;
free(temp);
}
*linkStack = NULL;
}
// 清空链栈
void clearLinkStack(LinkStack *linkStack) {
LinkStack p = *linkStack;
while (p) {
LinkStack temp = p;
p = p->next;
free(temp);
}
*linkStack = NULL;
}
// 判断链栈是否为空
Status linkStackEmpty(LinkStack *linkStack) {
return *linkStack == NULL;
}
// 返回链栈长度
int linkStackLength(LinkStack *linkStack) {
int length = 0;
LinkStack p = *linkStack;
while (p) {
length++;
p = p->next;
}
return length;
}
// 获取栈顶元素
Status getLinkStackTop(LinkStack *linkStack, int *element) {
if (linkStackEmpty(linkStack)) {
return 0;
}
*element = (*linkStack)->data;
return 1;
}
// 入栈
Status pushLinkStack(LinkStack *linkStack, ElementType element) {
LinkStack newNode = (LinkStack)malloc(sizeof(StackNode));
if (!newNode) {
return 0; // 内存分配失败
}
newNode->data = element;
newNode->next = *linkStack;
*linkStack = newNode;
return 1;
}
// 出栈
Status popLinkStack(LinkStack *linkStack, int *element) {
if (linkStackEmpty(linkStack)) {
return 0; // 栈空,无法出栈
}
LinkStack temp = *linkStack;
*element = temp->data;
*linkStack = temp->next;
free(temp);
return 1;
}
// 遍历链栈
void traverseLinkStack(LinkStack *linkStack) {
LinkStack p = *linkStack;
while (p) {
printf("%d\t", p->data);
p = p->next;
}
printf("\n");
}
void testLinkStack(void) {
LinkStack linkStack;
printf("链栈初始化中...\n");
if (initLinkStack(&linkStack)) {
printf("链栈初始化成功\n");
} else {
printf("链栈初始化失败\n");
}
printf("入栈...\n");
if (pushLinkStack(&linkStack, 1)) {
printf("入栈成功\n");
}
if (pushLinkStack(&linkStack, 2)) {
printf("入栈成功\n");
}
if (pushLinkStack(&linkStack, 3)) {
printf("入栈成功\n");
}
printf("栈中元素:\n");
traverseLinkStack(&linkStack);
printf("栈的长度:%d\n", linkStackLength(&linkStack));
if (!linkStackEmpty(&linkStack)) {
printf("栈不为空\n");
}
int top;
if (getLinkStackTop(&linkStack, &top)) {
printf("栈顶元素获取成功\n");
printf("栈顶元素:%d\n", top);
}
// 出栈测试
int element;
if (popLinkStack(&linkStack, &element)) {
printf("出栈成功,出栈元素为:%d\n", element);
}
if (popLinkStack(&linkStack, &element)) {
printf("出栈成功,出栈元素为:%d\n", element);
}
if (popLinkStack(&linkStack, &element)) {
printf("出栈成功,出栈元素为:%d\n", element);
}
printf("栈的长度:%d\n", linkStackLength(&linkStack));
if (linkStackEmpty(&linkStack)) {
printf("栈为空\n");
}
destroyLinkStack(&linkStack);
}