C语言栈的表示和实现的定义讲解

简介: C语言栈的表示和实现的定义讲解

在C语言中,栈(Stack)通常可以使用数组或链表来实现。这里,我将给出使用数组来实现栈的示例,并提供栈的基本操作:初始化栈、判断栈是否为空、入栈、出栈以及获取栈顶元素。

栈的定义

首先,我们需要定义一个结构体来表示栈,并包含栈顶指针、栈的大小以及存储数据的数组。

 

#include <stdio.h> 

 

#include <stdlib.h> 

 

#include <stdbool.h> 

 

 

 

#define MAX_STACK_SIZE 100 // 定义栈的最大容量

 

 

 

typedef struct {

 

int top; // 栈顶指针,-1表示栈为空

 

int capacity; // 栈的最大容量

 

int* array; // 存放栈元素的数组

 

} Stack;

栈的初始化

初始化栈时,需要为数组分配内存,并设置栈顶指针为-1(表示空栈)。

 

Stack* createStack(int capacity) {

 

Stack* stack = (Stack*)malloc(sizeof(Stack));

 

if (!stack) {

 

exit(1); // 内存分配失败

 

}

 

stack->capacity = capacity;

 

stack->top = -1;

 

stack->array = (int*)malloc(stack->capacity * sizeof(int));

 

if (!stack->array) {

 

free(stack);

 

exit(1); // 内存分配失败

 

}

 

return stack;

 

}

判断栈是否为空

通过检查栈顶指针是否为-1来判断栈是否为空。

 

bool isEmpty(Stack* stack) {

 

return stack->top == -1;

 

}

入栈操作

入栈操作将新元素放在栈顶,并更新栈顶指针。

 

bool push(Stack* stack, int data) {

 

if (stack->top == stack->capacity - 1) {

 

// 栈已满,无法入栈

 

return false;

 

}

 

stack->array[++stack->top] = data; // 先增加栈顶指针,再存放数据

 

return true;

 

}

出栈操作

出栈操作移除栈顶元素,并返回该元素的值。同时更新栈顶指针。

 

bool pop(Stack* stack, int* data) {

 

if (isEmpty(stack)) {

 

// 栈为空,无法出栈

 

return false;

 

}

 

*data = stack->array[stack->top--]; // 先取出数据,再减少栈顶指针

 

return true;

 

}

获取栈顶元素

获取栈顶元素但不移除它。

 

bool peek(Stack* stack, int* data) {

 

if (isEmpty(stack)) {

 

// 栈为空

 

return false;

 

}

 

*data = stack->array[stack->top];

 

return true;

 

}

销毁栈

销毁栈时,需要释放栈所使用的内存。

 

void destroyStack(Stack* stack) {

 

if (stack) {

 

free(stack->array);

 

free(stack);

 

}

 

}

测试栈的功能

 

int main() {

 

Stack* stack = createStack(MAX_STACK_SIZE);

 

 

 

push(stack, 1);

 

push(stack, 2);

 

push(stack, 3);

 

 

 

int topElement;

 

peek(stack, &topElement);

 

printf("Top element is: %d\n", topElement);

 

 

 

pop(stack, &topElement);

 

printf("Popped element is: %d\n", topElement);

 

 

 

peek(stack, &topElement);

 

printf("Top element is: %d\n", topElement);

 

 

 

destroyStack(stack);

 

return 0;

 

}

上述代码展示了如何使用数组来实现栈,并提供了栈的基本操作。需要注意的是,这种实现方式在栈的大小超过MAX_STACK_SIZE时会失败。在实际应用中,可能需要根据具体需求来选择是否使用动态调整大小的栈。此外,栈在实际应用中还可能涉及异常处理、线程安全等问题,这些在上面的简单示例中并未涉及。

 

目录
相关文章
|
1天前
|
Java C语言 C++
定义C语言的int main()函数
定义C语言的int main()函数
|
7天前
|
C语言
|
24天前
|
C语言
C语言学习记录——枚举(定义、与结构体的区别、优点)
C语言学习记录——枚举(定义、与结构体的区别、优点)
20 3
|
3天前
|
存储 C语言
C语言中的typedef关键字:为类型定义新名称
C语言中的typedef关键字:为类型定义新名称
9 0
|
5天前
|
编译器 C语言 C++
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
8 0
|
17天前
|
C语言 C++
【数据结构】C语言实现:栈(Stack)与队列(Queue)
【数据结构】C语言实现:栈(Stack)与队列(Queue)
|
24天前
|
C语言
C语言学习记录——矩阵转换(定义一个数组实现或定义两个数组实现)
C语言学习记录——矩阵转换(定义一个数组实现或定义两个数组实现)
13 0
|
25天前
数据结构——栈(C语言版)
数据结构——栈(C语言版)
11 0
|
1月前
|
存储 算法 编译器
C语言中的二维数组:定义与初始化技术详解
C语言中的二维数组:定义与初始化技术详解
60 0
|
1月前
|
存储 编译器 C语言
C语言指针变量的定义与初始化技术详解
C语言指针变量的定义与初始化技术详解
27 0