用c语言编写一个链栈,实现进栈出栈,释放栈
时间: 2024-10-18 08:24:26 浏览: 36
shunxubiao.rar_栈的顺序表_顺序栈,出栈
要使用C语言编写一个链栈,可以按照以下步骤进行:
1. **链栈的定义**[^1]:
- 定义一个节点结构体,包括数据域(data)和指针域(next),用于连接相邻节点。
```c
typedef struct Node {
int data; // 节点数据
struct Node* next; // 指向下一个节点的指针
} StackNode;
```
2. **链栈的初始化**:
- 创建链栈头指针,并设置为空。
```c
StackNode* top = NULL;
```
3. **链栈的进栈(push)**:
- 新建一个节点并将数据存入,然后链接到当前栈顶。
```c
void push(StackNode** top, int value) {
StackNode* newNode = (StackNode*)malloc(sizeof(StackNode));
newNode->data = value;
newNode->next = *top;
*top = newNode;
}
```
4. **链栈的出栈(pop)**:
- 如果栈不空,则删除并返回栈顶元素,否则返回NULL表示栈已空。
```c
int pop(StackNode** top) {
if (*top == NULL)
return -1; // 栈空
int value = (*top)->data;
StackNode* temp = *top;
*top = (*top)->next;
free(temp);
return value;
}
```
5. **链栈查找(search)**:
- 如果栈中有指定数据,返回其位置;否则返回-1。
```c
int search(StackNode* top, int value) {
StackNode* current = top;
while (current != NULL) {
if (current->data == value)
return 1; // 找到了
current = current->next;
}
return 0; // 没找到
}
```
6. **链栈的销毁(destruction)**:
- 循环遍历链表,对每个节点调用`free`释放内存。
```c
void destroy(StackNode* top) {
StackNode* temp;
while (top != NULL) {
temp = top;
top = top->next;
free(temp);
}
top = NULL;
}
```
7. **完整的链栈实现**:
- 包含上述所有功能的完整链栈类或函数。
```c
// 示例
StackNode* createStack(); // 初始化函数
void push(StackNode** top, int value); // 进栈
int pop(StackNode** top); // 出栈
int search(StackNode* top, int value); // 查找
void destroy(StackNode* top); // 销毁
StackNode* stack = createStack();
push(&stack, 10);
push(&stack, 20);
printf("%d\n", pop(&stack)); // 输出:20
printf("%d\n", search(stack, 10)); // 输出:1 (存在)
destroy(stack); // 释放栈内存
```
阅读全文