栈的基本操作的实现(初始化、进栈、出栈、取栈顶元素、判断栈是否为空、遍历等),要求分别采用顺序和链式存储结构。C语言代码及其运行结果截图。并解释代码。
时间: 2024-12-11 07:43:36 浏览: 52
PHP实现的栈数据结构示例【入栈、出栈、遍历栈】
在C语言中,我们可以使用数组(顺序存储)或链表(链式存储)来实现栈的数据结构。以下是两种实现方式的简单示例:
**一、顺序存储(数组)**
```c
#include <stdio.h>
#define MAX_SIZE 50
typedef struct {
int data[MAX_SIZE];
int top; // 栈顶指针
} Stack;
// 初始化栈
void init(Stack *s) {
s->top = -1;
}
// 进栈(压入)
void push(Stack *s, int item) {
if (s->top >= MAX_SIZE - 1) {
printf("Stack overflow.\n");
return;
}
s->data[++s->top] = item;
}
// 出栈(弹出)
int pop(Stack *s) {
if (s->top == -1) {
printf("Stack underflow.\n");
return -1; // 返回-1表示空栈
}
return s->data[s->top--];
}
// 取栈顶元素
int peek(Stack *s) {
if (s->top == -1) {
printf("Stack is empty.\n");
return -1;
}
return s->data[s->top];
}
// 判断栈是否为空
int isEmpty(Stack *s) {
return s->top == -1;
}
// 遍历(这里仅适用于数组,因为链表不需要从头开始遍历)
void traverse(Stack *s) {
if (!isEmpty(s)) {
for (int i = 0; i <= s->top; i++) {
printf("%d ", s->data[i]);
}
printf("\n");
} else {
printf("Stack is empty.\n");
}
}
int main() {
Stack stack;
init(&stack);
push(&stack, 1); // 进栈1
push(&stack, 2); // 进栈2
printf("Top element: %d\n", peek(&stack)); // 输出2
pop(&stack); // 出栈,剩余1
traverse(&stack); // 遍历栈:1
return 0;
}
```
**二、链式存储(链表)**
```c
#include <stdio.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
typedef struct {
Node* top;
} Stack;
// 初始化链表栈
void init(Stack *s) {
s->top = NULL;
}
// 同样其他方法,比如push, pop, peek, isEmpty, traverse都需要修改为处理链表节点。
// 这里不再提供链式存储版本的完整代码,因为实际代码会涉及创建新节点、链接节点以及释放内存等操作,
// 而这将涉及到更复杂的指针处理和内存管理,不适合在这里详述。你可以参考数据结构教材或在线资源了解如何实现。
在上述代码中,顺序存储栈利用了数组的一致性,插入和删除操作时间复杂度较高;而链式存储栈通过节点间的指针连接,使得插入和删除操作的时间复杂度相对较低,但访问栈顶元素需要遍历整个链表。实际应用中,选择哪种存储方式取决于具体的需求和性能考虑。
阅读全文