C语言中栈是一种常用的数据结构,常用于程序中的内存管理、函数调用等场景。在C语言中,栈的实现方法主要有两种:数组实现和链表实现。
数组实现
数组实现是一种简单、直接、易于理解和操作的方式。栈的数组实现要求开辟一段连续的内存空间,容量为栈的最大大小,在程序运行时空间大小固定,但在使用时效率高,适合空间比较紧张的场景。
下面是一个数组实现的栈结构的示意代码:
#define MAX_SIZE 10 // 定义栈的最大大小为10
int stack[MAX_SIZE];
int top = -1; // 栈顶指针初始化为-1
void push(int data){
if(top < MAX_SIZE - 1){ // 判断栈满
stack[++top] = data; // top指针加1,将元素压栈
}
}
int pop(){
if(top >= 0){ // 判断栈空
return stack[top--]; // 返回栈顶元素,并将top指针减1
}
}
在这段代码中,我们首先使用#define
指令定义栈的最大大小为10,然后定义整型数组stack
,用于存储栈的元素。top
变量表示栈顶指针,初始化为-1,表示栈为空。在push
操作中,我们首先判断栈是否已满,如果未满则将元素压入栈中,并将栈顶指针加1;在pop
操作中,我们首先判断栈是否为空,如果非空则返回栈顶元素,并将栈顶指针减1。下面是一个使用数组实现的栈结构的示例代码:
#include <stdio.h>
int main(){
push(1); // 压入元素1
push(2); // 压入元素2
printf("%d\n", pop()); // 弹出元素2
printf("%d\n", pop()); // 弹出元素1
return 0;
}
链表实现
链表实现是一种更加灵活、动态的方式。相较于数组实现,链表实现的空间大小可以灵活变化,不需要在程序开始时就确定大小;而且链表实现可以进行插入、删除等操作,比起数组实现更加灵活。
下面是一个链表实现的栈结构的示意代码:
struct StackNode {
int data;
struct StackNode *next;
};
struct StackNode *top = NULL; // 栈顶指针初始化为空
void push(int data) {
struct StackNode *newNode = (struct StackNode*)malloc(sizeof(struct StackNode)); // 动态创建一个栈节点
newNode->data = data;
newNode->next = top; // 将新节点的next指针指向当前栈顶节点
top = newNode; // 将新节点赋值给栈顶指针
}
int pop() {
if (top == NULL) return -1; // 栈空
int data = top->data; // 保存栈顶元素
struct StackNode *temp = top; // 保存栈顶节点
top = top->next; // 将栈顶指针下移一位
free(temp); // 释放栈顶节点
return data; // 返回栈顶元素
}
在这段代码中,我们首先定义了一个结构体StackNode
,用于表示一个栈节点。节点中包含data
变量(用于存储节点的数据)和next
指针(用于指向下一个节点)。top
变量表示栈顶指针,初始化为空。在push
操作中,我们首先使用malloc
函数动态创建一个新的栈节点,然后将新节点的next
指针指向当前栈顶节点,将新节点赋值给栈顶指针;在pop
操作中,我们首先判断栈是否为空,如果非空则保存栈顶元素并弹出栈顶节点。下面是一个使用链表实现的栈结构的示例代码:
#include <stdio.h>
int main(){
push(1); // 压入元素1
push(2); // 压入元素2
printf("%d\n", pop()); // 弹出元素2
printf("%d\n", pop()); // 弹出元素1
return 0;
}
以上就是C语言中栈的两种实现方法的详细讲解和示例代码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中栈的两种实现方法 - Python技术站