当前位置: 首页 > news >正文

【数据结构C/C++】链式存储与顺序存储结构栈

文章目录

  • 链式存储结构
  • 顺序存储结构

下面这篇文章是我大二时候写的比较详细的实现过程,再这篇文章我也会再一次比较简单的再次简述一下链式与顺序存储结构的实现方式。
链式存储结构与顺序存储结构详解
这里我就不使用C++再一次实现这两个栈了,有兴趣的也可以使用C++的STL库中的stack直接实现。

实现思路如下:

首先,我们定义了一个节点结构Node,每个节点包含一个整数数据和指向下一个节点的指针。
然后,我们定义了栈结构Stack,其中包括一个指向栈顶节点的指针top和一个表示栈大小的整数size。
初始化栈时,将top指针设置为NULL,表示栈为空,同时将size设置为0。
入栈操作(push)创建一个新节点,将数据存储在新节点中,然后将新节点插入到栈顶,并更新top和size。
出栈操作(pop)从栈顶移除一个节点,返回其数据,并释放节点内存,同时更新top和size。
查看栈顶元素操作(peek)返回栈顶节点的数据,不修改栈的状态。
打印栈中元素操作(printStack)遍历栈中的节点,打印每个节点的数据。
主函数中使用一个循环来接收用户输入的选项,然后调用相应的栈操作,以实现增删改查功能。

链式存储结构

#include <stdio.h>
#include <stdlib.h>// 定义节点结构
typedef struct Node {int data;struct Node *next;
} Node;// 定义栈结构
typedef struct Stack {Node *top;int size;
} Stack;// 初始化栈
void initStack(Stack *stack) {stack->top = NULL;stack->size = 0;
}// 入栈操作
void push(Stack *stack, int data) {Node *newNode = (Node *)malloc(sizeof(Node));if (newNode == NULL) {printf("内存分配失败\n");exit(1);}newNode->data = data;newNode->next = stack->top;stack->top = newNode;stack->size++;
}// 出栈操作
int pop(Stack *stack) {if (stack->top == NULL) {printf("栈为空\n");return -1; // 返回一个特殊值表示栈为空}Node *temp = stack->top;int data = temp->data;stack->top = temp->next;free(temp);stack->size--;return data;
}// 查看栈顶元素
int peek(Stack *stack) {if (stack->top == NULL) {printf("栈为空\n");return -1; // 返回一个特殊值表示栈为空}return stack->top->data;
}// 打印栈中的元素
void printStack(Stack *stack) {Node *current = stack->top;printf("栈中的元素: ");while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}int main() {Stack stack;initStack(&stack);int choice, data;while (1) {printf("1. 入栈  2. 出栈  3. 查看栈顶元素  4. 打印栈  5. 退出\n");printf("请输入选项: ");scanf("%d", &choice);switch (choice) {case 1:printf("请输入要入栈的数据: ");scanf("%d", &data);push(&stack, data);break;case 2:data = pop(&stack);if (data != -1)printf("出栈的元素是: %d\n", data);break;case 3:data = peek(&stack);if (data != -1)printf("栈顶元素是: %d\n", data);break;case 4:printStack(&stack);break;case 5:exit(0);default:printf("无效选项\n");}}return 0;
}

顺序存储结构

实现思路如下:

首先,我们定义了一个栈结构Stack,其中包括一个指向整数数组的指针array,栈的容量capacity,栈顶索引top,和当前栈中的元素个数size。
初始化栈时,分配内存并初始化Stack结构的字段,包括分配内存给array数组,将top初始化为-1表示栈为空,将size初始化为0。
入栈操作(push)检查栈是否已满,如果没有满,将数据存储在数组中,并更新top和size。
出栈操作(pop)检查栈是否为空,如果不为空,从数组中取出元素,更新top和size,并返回出栈的元素。
查看栈顶元素操作(peek)检查栈是否为空,如果不为空,返回栈顶元素。
打印栈中元素操作(printStack)遍历数组中的元素,打印每个元素。
主函数中使用一个循环来接收用户输入的选项,然后调用相应的栈操作,以实现增删改查功能。

#include <stdio.h>
#include <stdlib.h>// 定义栈结构
typedef struct Stack {int *array;  // 用于存储栈元素的数组int capacity; // 栈的容量int top;      // 栈顶索引int size;     // 当前栈中的元素个数
} Stack;// 初始化栈
Stack* initStack(int capacity) {Stack *stack = (Stack *)malloc(sizeof(Stack));if (stack == NULL) {printf("内存分配失败\n");exit(1);}stack->capacity = capacity;stack->array = (int *)malloc(sizeof(int) * capacity);if (stack->array == NULL) {printf("内存分配失败\n");exit(1);}stack->top = -1; // 初始化栈顶索引为-1,表示栈为空stack->size = 0; // 初始化栈中元素个数为0return stack;
}// 入栈操作
void push(Stack *stack, int data) {if (stack->size >= stack->capacity) {printf("栈已满\n");return;}stack->array[++stack->top] = data;stack->size++;
}// 出栈操作
int pop(Stack *stack) {if (stack->size <= 0) {printf("栈为空\n");return -1; // 返回一个特殊值表示栈为空}int data = stack->array[stack->top--];stack->size--;return data;
}// 查看栈顶元素
int peek(Stack *stack) {if (stack->size <= 0) {printf("栈为空\n");return -1; // 返回一个特殊值表示栈为空}return stack->array[stack->top];
}// 打印栈中的元素
void printStack(Stack *stack) {if (stack->size == 0) {printf("栈为空\n");return;}printf("栈中的元素: ");for (int i = 0; i <= stack->top; i++) {printf("%d ", stack->array[i]);}printf("\n");
}int main() {int capacity;printf("请输入栈的容量: ");scanf("%d", &capacity);Stack *stack = initStack(capacity);int choice, data;while (1) {printf("1. 入栈  2. 出栈  3. 查看栈顶元素  4. 打印栈  5. 退出\n");printf("请输入选项: ");scanf("%d", &choice);switch (choice) {case 1:printf("请输入要入栈的数据: ");scanf("%d", &data);push(stack, data);break;case 2:data = pop(stack);if (data != -1)printf("出栈的元素是: %d\n", data);break;case 3:data = peek(stack);if (data != -1)printf("栈顶元素是: %d\n", data);break;case 4:printStack(stack);break;case 5:free(stack->array);free(stack);exit(0);default:printf("无效选项\n");}}return 0;
}

下面是使用C++的stack库实现的栈,这个相当于没有实现任何功能,考研可不推荐这样子玩,当然如果考察的重点不是栈,而是使用栈解决某个问题,那么可以使用stack

#include <iostream>
#include <stack>using namespace std;int main() {stack<int> myStack;while (true) {int choice, data;cout << "1. 入栈  2. 出栈  3. 查看栈顶元素  4. 打印栈  5. 退出" << endl;cout << "请输入选项: ";cin >> choice;switch (choice) {case 1:cout << "请输入要入栈的数据: ";cin >> data;myStack.push(data);break;case 2:if (!myStack.empty()) {cout << "出栈的元素是: " << myStack.top() << endl;myStack.pop();} else {cout << "栈为空" << endl;}break;case 3:if (!myStack.empty()) {cout << "栈顶元素是: " << myStack.top() << endl;} else {cout << "栈为空" << endl;}break;case 4:if (!myStack.empty()) {cout << "栈中的元素: ";stack<int> tempStack = myStack;while (!tempStack.empty()) {cout << tempStack.top() << " ";tempStack.pop();}cout << endl;} else {cout << "栈为空" << endl;}break;case 5:return 0;default:cout << "无效选项" << endl;}}return 0;
}
http://www.lryc.cn/news/186693.html

相关文章:

  • 【数据库系统概论】数据定义之基本表的定义/创建、修改和删除
  • 面试算法22:链表中环的入口节点(1)
  • 蓝桥杯---第二讲---二分与前缀和
  • d3dx9_39.dll如何修复?最新修复d3dx9_39.dll方法分享
  • 阿里云轻量应用服务器月流量限制说明(部分套餐不限流量)
  • 项目设计:YOLOv5目标检测+机构光相机(intel d455和d435i)测距
  • WPF中DataContext的绑定技巧
  • 【Spring MVC研究】MVC原理:DispatcherServlet的初始化,初始化好等于MVC准备好
  • Kafka的分布式架构与高可用性
  • Spring Cloud学习笔记【分布式请求链路跟踪-Sleuth】
  • Java开发中的操作日志详解(InsCode AI 创作助手)
  • FutureTask和CompletableFuture的模拟使用
  • Redis作为缓存,mysql的数据如何与redis进行同步?
  • 申请免费 SSL 证书为您的小程序加密通信
  • Go 并发编程
  • 鱼眼相机去畸变(图像拉直/展开/矫正)算法及实战总结
  • es6 数据类型
  • 【postgresql】
  • 【C++】空间配置器 allocator:原理及底层解析
  • 微信小程序 movable-area 区域拖动动态组件演示
  • 隔离上网,安全上网
  • NOSQL Redis 数据持久化 RDB、AOF(二) 恢复
  • UDP通信
  • Bootstrap对溢出内容的两种处理:滚动条和隐藏两种方式
  • elasticsearch基本语法
  • Maven Spring jar包启动报错 排查
  • LeetCode-2485-找出中枢整数
  • nano pi m1配置脚本(全志H3)
  • linux--gdb的使用
  • JVM命令行监控工具