代码解释
typedef struct StackNode {
int data;
struct StackNode *next;
} StackNode, *LinkStack;
- 定义了一个结构体
StackNode
,表示栈的节点,包含整型数据 data
和指向下一个节点的指针 next
。
- 使用
typedef
定义了 StackNode
别名为 LinkStack
,方便后续使用。
int InitStack(LinkStack *s) {
*s = NULL;
return 1;
}
- 初始化栈,将栈顶指针置为空,即将栈初始化为空栈。
- 函数返回值为 1 表示初始化成功。
int Push(LinkStack *s, int e) {
StackNode *p = (StackNode *)malloc(sizeof(StackNode));
if (!p) {
return 0;
}
p->data = e;
p->next = *s;
*s = p;
return 1;
}
- 创建一个新节点并将数据
e
入栈。
- 如果内存分配失败,则返回 0;否则返回 1 表示入栈成功
int Pop(LinkStack *s, int *e) {
if (*s == NULL) {
return 0;
}
*e = (*s)->data;
StackNode *p = *s;
*s = (*s)->next;
free(p);
return 1;
}
- 将栈顶元素出栈,并将其值保存在
e
中。
- 如果栈为空,则返回 0;否则返回 1 表示出栈成功。
int GetTop(LinkStack s, int *e) {
if (s != NULL) {
*e = s->data;
return 1;
}
return 0;
}
- 获取栈顶元素的值并保存在
e
中。
- 如果栈为空,则返回 0;否则返回 1 表示获取成功。
void TraverseStack(LinkStack s) {
StackNode *p = s;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
完整代码
#include <stdio.h>
#include <stdlib.h>
typedef struct StackNode {
int data;
struct StackNode *next;
} StackNode, *LinkStack;
// 初始化栈
int InitStack(LinkStack *s) {
*s = NULL; // 将栈顶指针置为空
return 1;
}
// 入栈操作
int Push(LinkStack *s, int e) {
StackNode *p = (StackNode *)malloc(sizeof(StackNode));
if (!p) {
return 0; // 内存分配失败
}
p->data = e;
p->next = *s;
*s = p; // 将新节点插入到栈顶
return 1;
}
// 出栈操作
int Pop(LinkStack *s, int *e) {
if (*s == NULL) {
return 0; // 空栈,出栈失败
}
*e = (*s)->data;
StackNode *p = *s;
*s = (*s)->next;
free(p); // 释放节点内存
return 1;
}
// 获取栈顶元素
int GetTop(LinkStack s, int *e) {
if (s != NULL) {
*e = s->data;
return 1;
}
return 0; // 空栈,获取失败
}
// 遍历栈内元素并输出
void TraverseStack(LinkStack s) {
StackNode *p = s;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
LinkStack stack;
int choice, value, topValue;
InitStack(&stack);
while (1) {
printf("1. 入栈\n");
printf("2. 出栈\n");
printf("3. 获取栈顶元素\n");
printf("4. 遍历栈内元素\n");
printf("5. 退出\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入要入栈的元素:");
scanf("%d", &value);
Push(&stack, value);
break;
case 2:
if (Pop(&stack, &value)) {
printf("出栈成功,出栈元素为:%d\n", value);
} else {
printf("出栈失败,栈为空\n");
}
break;
case 3:
if (GetTop(stack, &topValue)) {
printf("栈顶元素为:%d\n", topValue);
} else {
printf("栈为空\n");
}
break;
case 4:
printf("栈内元素为:");
TraverseStack(stack);
break;
case 5:
printf("程序退出\n");
exit(0);
default:
printf("输入有误,请重新输入\n");
}
}
return 0;
}