C语言共享栈
时间:2022-07-25
本文章向大家介绍C语言共享栈,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
栈的操作我相信大家都应该了解了弄懂了, 如果没弄懂希望可以去再去看看相关的资料,我博客中的C语言中缀表达式转后缀表达式中涉及到了一下栈的基本操作,有兴趣的朋友也可以看看。 所谓共享栈,就是两个栈共同使用一块内存空间,其中一个栈的栈底作为另一个栈的栈顶,反之亦然。
开始
思路分析
因为两个栈公用一个空间,假设一个栈为0#,规定其为空时top[0]==-1;另一个栈为1#规定其为空时,top[1]==MaxSize; 入栈时,先确定栈号是否合法,然后查看是对0#栈还是1#栈进行操作,入栈操作和顺序栈的入栈操作并无太大不同。 选定之后进行入栈操作。这里应该注意此共享栈是否已满,如果已满则不能进行入栈操作。如若入栈成功则返回0;入栈失败则返回-1; 出栈时,先确定栈号是否合法,然后查看是对0#栈还是1#栈进行操作,出栈操作和顺序栈的出栈操作并无太大不同。 选定之后进行出栈操作。如果出栈成功返回0;出栈失败返回-1;
添加适当的头文件,定义一个栈数据结构,
共享栈也是栈,只不过有点特殊,在这里我们还是需要添加适当的头文件和定义恰当的数据结构
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int top[2];
}SqStack;
初始化共享栈
由于我这里用的是顺序存储结构的栈结构(也就是数据),top也就是一个标记而已,分别代编栈1和栈2的标记
void InitStack(SqStack *s)
{
s->top[0] = -1;
s->top[1] = MaxSize;
}
入栈操作
在入栈的时候,我们需要选择入的是两个栈中的哪一个栈,我们这里用0和1来区分
int Push(SqStack*s, ElemType x, int n)
{
if (n < 0 || n>1) {
printf("The stack number is false!n");
return -1;
}
if (s->top[1] - s->top[0] == 1) {
printf("The stack is full!n");
return -1;
}
switch (n) {
case 0:s->data[++s->top[0]] = x; break;
case 1:s->data[--s->top[1]] = x; break;
}
return 0;
}
出栈操作
出栈和入栈一样,也需要选择出栈的具体是哪个栈
int Pop(SqStack *s, ElemType* x, int n)
{
if (n < 0 || n>1) {
printf("The stack number is false!n");
return -1;
}
switch (n) {
case 0:
if (s->top[0] == -1) {
printf("The stack[0] is empty!n");
}
*x = s->data[s->top[0]--];
break;
case 1:
if (s->top[1] == MaxSize) {
printf("The stack[1] is empty!n");
}
*x = s->data[s->top[1]++];
break;
}
return 0;
}
主函数
int main(int argc, char* argv[])
{
SqStack s;
InitStack(&s);
ElemType x = 5;
int n = 0;
int flagPush;
flagPush = Push(&s, x, n);
if (flagPush) {
printf("Push false!n");
}
else {
printf("Push %d success!n", x);
}
int flagPop;
flagPop = Pop(&s, &x, n);
if (flagPop) {
printf("Pop false!n");
}
else {
printf("Pop %d success!n", x);
}
return 0;
}
以上就是共享栈的简单操作,我这里只测试他是否能够成功,如有需要,请研读代码后自行修改,如果一时看不懂,请多看几遍思路分析,把原理弄懂,代码还是想当简单的。
注:
- 上述代码在visual studio 2015中编译成功运行,其他ide请自行测试
- 上述文字皆为个人看法,如有错误或建议请及时联系我
- Oracle数据库(二)常用关键字以及函数
- Oracle数据库(三)表操作,连接查询,分页
- 正式学习第一天下午——基础标签及其属性
- 正式学习第二天上午——常用标签及列表 0605
- Java之面向对象例子(三) 多态,重写,重载,equals()方法和toString()方法的重写
- Java之IO流补充
- JavaWeb 例子 JDBC+JSP登陆注册留言板
- 基于bro的计算机入侵取证实战分析
- 如何用HERCULES绕过杀软
- 纯JSP实现用户登录注册,记事本
- Java常见问题
- JavaWeb(一)JSP原理,组成
- JavaWeb(二)jsp运行原理,九大内置对象
- PL/SQL 编程(一)基础,变量,分支,循环,异常
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【时序预测】一文梳理时间序列预测——ARMA模型
- 三分钟Kubernetes-环境搭建篇
- Linux分区页框分配器之水位
- 使用GPU训练模型
- Spring事务源码分析专题(一)JdbcTemplate使用及源码分析
- TensorFlow处理运动想象分类任务
- 使用kepler.gl可视化地理空间数据
- 聊聊 Python 代码覆盖率工具 - Coverage
- 目标检测模型YOLO-V1损失函数详解
- 轻松学Pytorch-使用ResNet50实现图像分类
- IDEA奇淫小技巧
- [PHP框架] ThinkPHP6 介绍、安装及配置
- 【翻译】withoutboats 的 io-uring 笔记
- [Python]随机生成大量的虚拟信息测试数据(姓名,手机号,ID,家庭住址等)
- Java核心技术之动态代理