用c语言设计一段语言,要求实现栈的基本操作 为代码添加注释
时间: 2024-10-23 15:12:38 浏览: 16
在 C 语言中,我们可以创建一个简单的链表结构来模拟栈数据结构,因为 C 本身不支持内置的动态数组栈。以下是一个基本的栈实现,包括入栈(push)、出栈(pop)、查看栈顶元素(top)以及判断栈是否为空(is_empty):
```c
#include <stdio.h>
#include <stdlib.h> // 引入 malloc 和 free 函数
// 定义栈节点结构体
typedef struct Node {
int data; // 存储的数据
struct Node* next; // 指向下一个节点的指针
} StackNode;
// 创建一个新的栈节点
StackNode* createNode(int value) {
StackNode* newNode = (StackNode*)malloc(sizeof(StackNode)); // 分配内存
if (newNode == NULL) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->data = value;
newNode->next = NULL;
return newNode;
}
// 初始化空栈
StackNode* initStack() {
return NULL;
}
// 入栈操作
void push(StackNode** stack, int value) {
StackNode* newNode = createNode(value);
if (*stack == NULL) { // 栈为空,将新节点设置为首节点
*stack = newNode;
} else {
newNode->next = *stack; // 将新节点连接到当前栈顶
*stack = newNode; // 更新栈顶为新节点
}
}
// 出栈操作
int pop(StackNode** stack) {
if (*stack == NULL) { // 如果栈为空,返回错误
printf("Stack is empty.\n");
return -1;
}
int topValue = (*stack)->data; // 获取栈顶值
StackNode* temp = *stack; // 保存当前栈顶
*stack = (*stack)->next; // 移除栈顶节点
free(temp); // 释放已使用空间
return topValue;
}
// 查看栈顶元素,但不移除
int peek(StackNode* stack) {
if (stack == NULL) {
printf("Stack is empty.\n");
return -1;
}
return stack->data;
}
// 判断栈是否为空
int isEmpty(StackNode* stack) {
return stack == NULL;
}
// 测试栈
int main() {
StackNode* stack = initStack();
// 入栈示例
push(&stack, 10);
push(&stack, 20);
push(&stack, 30);
// 出栈、查看和检查栈状态
printf("Top element: %d\n", peek(stack));
printf("Popped value: %d\n", pop(&stack));
// 检查栈是否为空
if (isEmpty(stack)) {
printf("Stack is now empty.\n");
}
return 0;
}
```
阅读全文