在C语言中,可以使用数组或链表来实现栈的定义。
使用数组实现栈: 首先,需要定义一个数组和一个变量作为栈顶指针。栈顶指针指向栈中最新添加的元素。
#define MAX_SIZE 100 // 栈的最大容量
int stack[MAX_SIZE]; // 定义一个数组作为栈
int top = -1; // 栈顶指针初始化为-1
// 入栈操作
void push(int element) {
if (top >= MAX_SIZE - 1) {
printf("Stack Overflow\n");
return;
}
stack[++top] = element;
}
// 出栈操作
int pop() {
if (top == -1) {
printf("Stack Underflow\n");
return -1;
}
return stack[top--];
}
// 获取栈顶元素
int peek() {
if (top == -1) {
printf("Stack is empty\n");
return -1;
}
return stack[top];
}
// 判断栈是否为空
int isEmpty() {
return (top == -1);
}
// 判断栈是否已满
int isFull() {
return (top == MAX_SIZE - 1);
}
使用链表实现栈: 定义一个结构体作为链表节点,其中包含一个数据域和一个指向下一个节点的指针。
typedef struct StackNode {
int data; // 数据域
struct StackNode* next; // 下一个节点的指针
} StackNode;
StackNode* top = NULL; // 栈顶指针初始化为空
// 入栈操作
void push(int element) {
StackNode* newNode = (StackNode*)malloc(sizeof(StackNode)); // 创建新节点
newNode->data = element; // 设置新节点的数据域
newNode->next = top; // 将新节点的指针指向当前栈顶节点
top = newNode; // 更新栈顶指针
}
// 出栈操作
int pop() {
if (top == NULL) {
printf("Stack Underflow\n");
return -1;
}
int element = top->data; // 获取栈顶节点的数据域
StackNode* temp = top; // 保存当前栈顶节点的指针
top = top->next; // 更新栈顶指针
free(temp); // 释放原栈顶节点的内存
return element;
}
// 获取栈顶元素
int peek() {
if (top == NULL) {
printf("Stack is empty\n");
return -1;
}
return top->data;
}
// 判断栈是否为空
int isEmpty() {
return (top == NULL);
}
以上是两种常见的实现栈的方法,具体选择哪一种取决于应用的需求和个人偏好。