C语言中的栈实现
在计算机科学中,栈(Stack)是一种重要的数据结构,遵循“后进先出”(LIFO)的原则。本文将介绍一个用C语言实现的栈,包括栈的基本操作,如初始化、入栈、出栈、查看栈顶元素、遍历栈及判断栈是否为空。
一、栈的基本结构
在C语言中,我们可以使用结构体来定义栈。以下是栈的基本结构定义:
#define MAX 100
typedef struct {
int top; // 栈顶指针
int data[MAX]; // 存储栈元素的数组
} Stack, *stack;
这里,我们定义了一个名为`Stack`的结构体,包含一个整型变量`top`,用于指示栈顶的位置,以及一个整型数组`data`,用于存储栈中的数据。`MAX`宏定义了栈的最大容量为100。
二、栈的初始化
栈的初始化是栈操作的第一步。我们定义了一个函数`ini_stack`来初始化栈:
void ini_stack(stack p) {
p->top = -1; // 初始化栈顶指针为-1,表示栈为空
}
在该函数中,我们将栈顶指针`top`初始化为-1,表示栈为空。
三、入栈操作
入栈操作是将元素添加到栈顶。我们使用`push_stack`函数实现这一功能:
void push_stack(stack p, int value) {
if (p->top >= MAX - 1) {
printf("stack is full\n"); // 栈已满
return;
}
p->data[++p->top] = value; // 将值添加到栈顶
printf("push: %d\n", p->data[p->top]);
}
在该函数中,我们首先检查栈是否已满。如果未满,则将新值添加到栈顶,并更新`top`指针。
四、出栈操作
出栈操作是将栈顶元素移除。我们使用`pop_stack`函数实现这一功能:
void pop_stack(stack p) {
if (is_empty(p)) {
printf("stack is empty\n"); // 栈为空
return;
}
printf("pop: %d\n", p->data[p->top--]); // 输出并移除栈顶元素
}
在该函数中,我们首先检查栈是否为空。如果不为空,则输出栈顶元素并将`top`指针减一。
五、查看栈顶元素
查看栈顶元素的操作可以通过`peek_top`函数实现:
void peek_top(stack p) {
if (is_empty(p)) {
printf("stack is empty\n"); // 栈为空
return;
}
printf("top: %d\n", p->data[p->top]); // 输出栈顶元素
}
该函数会检查栈是否为空,如果不为空,则输出栈顶元素。
六、遍历栈
遍历栈的操作可以通过`traversal_stack`函数实现:
void traversal_stack(stack p) {
printf("traversal stack\n");
for (int i = p->top; i > -1; i--) {
printf("%d\n", p->data[i]); // 输出栈中所有元素
}
printf("traversal end\n");
}
该函数会从栈顶开始,依次输出栈中的所有元素。
七、判断栈是否为空
判断栈是否为空的操作可以通过`is_empty`函数实现:
int is_empty(stack p) {
return p->top == -1 ? 1 : 0; // 返回1表示栈为空,返回0表示栈非空
}
该函数会检查`top`指针是否为-1,如果是,则返回1,表示栈为空。
八、总结
栈作为一种重要的数据结构,在许多算法和应用中具有广泛的应用。掌握栈的实现能够帮助我们更好地理解数据结构与算法的基本原理。希望通过本文,读者能够对栈的实现有一个清晰的认识,并在实际编程中灵活运用。
完整代码
Lk.h
#pragma once
#define MAX 100
#include<stdio.h>
#include<stdlib.h>
typedef struct {
int top;
int data[MAX];
}Stack,*stack;
void ini_stack(stack p);
void push_stack(stack p, int value);
void pop_stack(stack p);
void peek_top(stack p);
void traversal_stack(stack p);
int is_empty(stack p);
Lk.cpp
#include "Lk.h"
void ini_stack(stack p)
{
p->top = -1;
//(*p).top = -1;在C语言中,(*p).top 是访问指针 p 所指向结构体的成员 top 的一种方式。这种方式稍微有点繁琐,
//因为需要使用括号来确保优先级正确。更常见的是使用箭头运算符 -> 来简化这种访问,即 p->top。
}
void push_stack(stack p, int value)
{
if (p->top >= MAX-1) {
printf("stack is full\n");//top达到MAX-1时已满
return;
}
p->data[++p->top] = value;
printf("push: %d\n", p->data[p->top]);
}
void pop_stack(stack p)
{
if (is_empty(p)) {
printf("stack is empty\n");
return;
}
printf("pop: %d\n", p->data[p->top--]);
}
void peek_top(stack p)
{
if (is_empty(p)) {
printf("stack is empty\n");
return;
}
printf("top: %d\n", p->data[p->top]);
}
void traversal_stack(stack p)
{
printf("traversal stack\n");
for (int i = p->top; i > -1; i--)
{
printf("%d\n", p->data[i]);
}
printf("traversal end\n");
}
int is_empty(stack p)
{
return p->top==-1 ? 1 : 0;//empty 1
}
main.cpp
#include"Lk.h"
int main() {
/*typedef struct {
int top;
int data[MAX];
}Stack, * stack;*/
/*void ini_stack(stack p);
void push_stack(stack p, int value);
void pop_stack(stack p);
void peek_top(stack p);
void traversal_stack(stack p);
int is_empty(stack p);*/
stack s = (stack)malloc(sizeof(Stack));
ini_stack(s);
for(int i=0;i<10;i++)
push_stack(s,i);
peek_top(s);
for(int j=0;j<5;j++)
pop_stack(s);
peek_top(s);
traversal_stack(s);
free(s);
s = NULL;
return 0;
}