数据结构 栈

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;
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值