设计一个算法,实现链栈的出栈操作包括结构体定义和主函数 要求关键代码做好注释
时间: 2024-11-10 16:13:22 浏览: 35
设计一个简单的链式栈数据结构,我们首先需要定义一个`Node`结构体,它包含一个值域`data`和一个指向下一个节点的指针`next`。然后实现一个`Stack`类,其中包含基本的出栈操作如`push`、`pop`以及一个表示栈是否为空的标志。
```c
// 链栈的Node结构体定义
typedef struct Node {
int data; // 结点存储的数据
struct Node* next; // 指向下一个结点的指针
} Node;
// 链栈结构体定义
typedef struct Stack {
Node* top; // 栈顶指针
bool isEmpty; // 栈是否为空的标志
} Stack;
// 创建一个新的空栈
Stack* createStack() {
Stack* stack = (Stack*)malloc(sizeof(Stack));
stack->top = NULL;
stack->isEmpty = true;
return stack;
}
// 向栈顶添加元素(入栈)
void push(Stack* stack, int value) {
Node* newNode = (Node*)malloc(sizeof(Node)); // 分配新节点内存
newNode->data = value;
newNode->next = stack->top; // 新节点的next指向前一个栈顶
stack->top = newNode; // 更新栈顶
stack->isEmpty = false; // 栈不再为空
}
// 出栈操作,返回并删除栈顶元素
int pop(Stack* stack) {
if (stack->isEmpty) { // 如果栈为空,返回错误或抛异常
printf("Error: Stack is empty.\n");
return -1;
}
int poppedValue = stack->top->data; // 保存要弹出的值
Node* temp = stack->top; // 临时保存当前栈顶
stack->top = stack->top->next; // 移动栈顶到下一位
free(temp); // 释放已移除的节点内存
stack->isEmpty = stack->top == NULL; // 判断栈是否为空
return poppedValue; // 返回出栈的值
}
// 主函数示例,演示链栈的创建和出栈操作
int main() {
Stack* myStack = createStack();
// 入栈操作
push(myStack, 10);
push(myStack, 20);
push(myStack, 30);
// 出栈操作
int topValue = pop(myStack);
printf("Popped value: %d\n", topValue); // 输出 30
// 再次尝试出栈
topValue = pop(myStack);
printf("Popped value: %d\n", topValue); // 输出 20
// 最后一次出栈
topValue = pop(myStack);
printf("Popped value: %d\n", topValue); // 输出 10
return 0;
}
```
阅读全文