如何在C语言中通过数组和链表实现栈的push、peek和pop操作?请提供具体的代码实现。
时间: 2024-10-26 18:15:25 浏览: 31
为了更深入地了解栈的数据结构及其在C语言中的实现方式,建议参考《C语言实现栈的三种方式:数组、单链表、双链表》这篇文档。它详细讲解了如何使用数组和链表(包括单向链表和双向链表)来实现栈的功能。
参考资源链接:[C语言实现栈的三种方式:数组、单链表、双链表](https://wenku.csdn.net/doc/65bxwy1nik?spm=1055.2569.3001.10343)
数组实现栈的核心在于使用数组的索引来追踪栈顶位置。以下是数组实现栈的简单代码示例:
```c
#define MAXSIZE 10 // 定义栈的最大容量
typedef struct {
int data[MAXSIZE];
int top;
} ArrStack;
void push(ArrStack *s, int element) {
if (s->top == MAXSIZE - 1) {
// 栈满,无法添加新元素
} else {
s->top++;
s->data[s->top] = element;
}
}
int pop(ArrStack *s) {
if (s->top == -1) {
// 栈空,无法弹出元素
return -1;
} else {
int element = s->data[s->top];
s->top--;
return element;
}
}
int peek(ArrStack *s) {
if (s->top == -1) {
return -1;
} else {
return s->data[s->top];
}
}
```
链表实现栈则利用指针来管理节点的链接。以下是单向链表实现栈的代码示例:
```c
typedef struct Node {
int data;
struct Node *next;
} Node, *LinkStackPtr;
typedef struct {
LinkStackPtr top;
int count;
} LinkStack;
void push(LinkStack *s, int element) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = element;
newNode->next = s->top;
s->top = newNode;
s->count++;
}
int pop(LinkStack *s) {
if (s->top == NULL) {
return -1;
} else {
Node *temp = s->top;
int element = temp->data;
s->top = temp->next;
free(temp);
s->count--;
return element;
}
}
int peek(LinkStack *s) {
if (s->top == NULL) {
return -1;
} else {
return s->top->data;
}
}
```
通过这两个示例代码,你可以看到数组和链表在实现栈时的区别和特点。数组实现栈简单但大小固定,而链表实现栈灵活但需要额外的空间来存储指针信息。掌握这两种实现方式将有助于你在遇到不同编程问题时做出更合适的选择。
参考资源链接:[C语言实现栈的三种方式:数组、单链表、双链表](https://wenku.csdn.net/doc/65bxwy1nik?spm=1055.2569.3001.10343)
阅读全文