📅  最后修改于: 2023-12-03 15:05:21.972000             🧑  作者: Mango
在程序设计中,stack(又称为栈)是一个非常重要的数据结构,它涉及到程序的内存管理、函数调用、表达式求值等方面。在使用 stack 的过程中,push 操作是最常用的操作之一,即向栈中添加元素。
C 编程语言提供了 stack 数据结构的实现,可以通过数组或链表的方式来实现栈。下面我们分别介绍这两种实现方式的 push 操作。
数组实现方式是最常见的 stack 实现方式,它的 push 操作如下所示:
#define MAX_SIZE 10
int stack[MAX_SIZE];
int top = -1;
void push(int val) {
if (top == MAX_SIZE - 1) {
printf("Stack overflow\n");
return;
}
top++;
stack[top] = val;
}
可以看出,当栈已经满了时,调用 push 操作会输出一条提示信息并返回。否则,顶部指针 top 会指向栈顶下一个位置,新添加的元素会被存放到这个位置上。
链表实现方式相对于数组实现方式来说更加灵活,因为不需要像数组那样提前预设一个固定的大小。链表实现方式的 push 操作如下所示:
typedef struct node {
int val;
struct node *next;
} Node;
Node *head = NULL;
void push(int val) {
Node *new_node = (Node *) malloc(sizeof(Node));
if (new_node == NULL) {
printf("Memory allocation failed\n");
return;
}
new_node->val = val;
new_node->next = head;
head = new_node;
}
可以看出,这里我们新建了一个结构体 Node ,其中包含了数值和一个指向下一个结点的指针 next 。当添加新元素时,我们新建了一个 Node 结点,并将原来的头结点 head 指向它的 next 指针。鉴于链表的动态性,在 push 操作时不需要担心栈满的情况出现,只需要预估好内存可用空间即可。
总之,无论是数组实现方式还是链表实现方式,push 操作都是 stack 中不可或缺的一部分,深入掌握它可以为我们数据结构和算法方面的学习带来很多的便利。