如何用C语言实现顺序存储方式的栈(入栈和出栈操作)以及链式存储方式的栈(进出栈操作)?
时间: 2024-10-22 11:28:29 浏览: 1
当然可以。在C语言中,我们可以分别用数组(顺序存储)和链表(链式存储)来实现栈。
**顺序存储方式(数组栈):**
```c
#include <stdio.h>
#define MAX_SIZE 10
typedef struct {
int top;
int stack[MAX_SIZE];
} Stack;
// 函数声明
Stack* create_stack();
void push(Stack*, int);
int pop(Stack*);
// 创建空栈
Stack* create_stack() {
Stack* s = (Stack*)malloc(sizeof(Stack));
s->top = -1;
return s;
}
// 入栈操作(元素压入栈顶)
void push(Stack* s, int value) {
if (s->top >= MAX_SIZE - 1) {
printf("Stack overflow.\n");
return;
}
s->top++;
s->stack[s->top] = value;
}
// 出栈操作(返回并移除栈顶元素)
int pop(Stack* s) {
if (s->top == -1) {
printf("Stack underflow.\n");
return -1; // 或者你可以选择其他错误处理方式
}
int value = s->stack[s->top];
s->top--;
return value;
}
```
**链式存储方式(链表栈):**
```c
#include <stdio.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
typedef struct {
Node* top;
} Stack;
// 函数声明
Stack* create_linked_stack();
void push_linked(Stack*, int);
int pop_linked(Stack*);
// 创建空链表栈
Stack* create_linked_stack() {
Stack* s = (Stack*)malloc(sizeof(Stack));
s->top = NULL;
return s;
}
// 入栈操作(创建新节点并链接到栈顶)
void push_linked(Stack* s, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = s->top;
s->top = newNode;
}
// 出栈操作(删除栈顶节点并返回其值)
int pop_linked(Stack* s) {
if (s->top == NULL) {
printf("Stack underflow.\n");
return -1;
}
int value = s->top->data;
Node* temp = s->top;
s->top = s->top->next;
free(temp); // 释放已删除节点内存
return value;
}
```
以上就是顺序和链式存储方式的栈的基本实现。记得在实际使用时,需要对这些函数进行适当的错误处理和边界检查。
阅读全文