共享栈
时间:2022-04-22
本文章向大家介绍共享栈,主要内容包括数据结构、出栈操作、入栈操作、示例代码、运行结果、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
共享栈,即是两个栈使用同一段存储空间。
第一个栈从数组头开始存储,第二个栈从数组尾开始,两个栈向中间拓展。
当top1+1==top2或者top1==top2-1时,即staock overflow!.
与普通栈一样,共享栈出栈入栈的时间复杂度仍为O(1).
数据结构
typedef struct shareStack{
int data[MAXSIZE];
int top1;
int top2;
}shareStack;
出栈操作
该数据,仅存的是非负数,因此如果想要存储更复杂的操作,可以在判断栈空时,换一种方式,即可。
int Pop(shareStack *ss,int flag){
if(flag == 1){
if(ss->top1 == -1)
return -1;
return ss->data[ss->top1--];
}else if(flag == 2){
if(ss->top2 == MAXSIZE)
return -1;
return ss->data[ss->top2++];
}
return -1;
}
入栈操作
int Push(shareStack *ss,int num,int flag){
if(ss->top1+1 == ss->top2)
return 0;
if(flag == 1){
ss->data[++ss->top1] = num;
return 1;
}else if( flag == 2){
ss->data[--ss->top2] = num;
return 1;
}
return 0;
}
示例代码
1 #include <stdio.h>
2 #include <stdlib.h>
3 #define MAXSIZE 20
4
5 typedef struct shareStack{
6 int data[MAXSIZE];
7 int top1;
8 int top2;
9 }shareStack;
10
11 void createStack(shareStack * ss,int n,int m);
12 void showStack(shareStack *ss);
13 int Push(shareStack *ss,int num,int flag);
14 int Pop(shareStack *ss,int flag);
15
16 int main()
17 {
18 shareStack * ss = (shareStack *)malloc(sizeof(shareStack));
19
20 createStack(ss,3,4);
21 showStack(ss);
22
23 if(Push(ss,6,1))
24 showStack(ss);
25
26 if(Push(ss,4,2))
27 showStack(ss);
28
29 int n;
30 n=Pop(ss,1);
31 if(n>=0)
32 printf("the pop num is:%dn",n);
33 n=Pop(ss,2);
34 if(n>=0)
35 printf("the pop num is:%dn",n);
36 n=Pop(ss,1);
37 if(n>=0)
38 printf("the pop num is:%dn",n);
39 n=Pop(ss,1);
40 if(n>=0)
41 printf("the pop num is:%dn",n);
42 n=Pop(ss,1);
43 if(n>=0)
44 printf("the pop num is:%dn",n);
45 n=Pop(ss,1);
46 if(n>=0)
47 printf("the pop num is:%dn",n);
48 n=Pop(ss,1);
49 if(n>=0)
50 printf("the pop num is:%dn",n);
51
52 showStack(ss);
53
54 return 0;
55 }
56
57 void createStack(shareStack * ss,int n,int m){
58 int i;
59 ss->top1 = -1;
60 ss->top2 = MAXSIZE;
61 for(i=0;i<n;i++){
62 ss->top1++;
63 ss->data[ss->top1] = 2*i+1;
64 }
65 for(i=0;i<m;i++){
66 ss->top2--;
67 ss->data[ss->top2] = 2*i+1;
68 }
69 }
70
71 void showStack(shareStack *ss){
72 int i;
73 for(i=0;i<ss->top1+1;i++){
74 printf("%d->",ss->data[i]);
75 }
76 printf("top1-----top2");
77 for(i=ss->top2;i<MAXSIZE;i++){
78 printf("<-%d",ss->data[i]);
79 }
80 printf("n");
81 }
82
83 int Push(shareStack *ss,int num,int flag){
84 if(ss->top1+1 == ss->top2)
85 return 0;
86 if(flag == 1){
87 ss->data[++ss->top1] = num;
88 return 1;
89 }else if( flag == 2){
90 ss->data[--ss->top2] = num;
91 return 1;
92 }
93 return 0;
94 }
95
96 int Pop(shareStack *ss,int flag){
97 if(flag == 1){
98 if(ss->top1 == -1)
99 return -1;
100 return ss->data[ss->top1--];
101 }else if(flag == 2){
102 if(ss->top2 == MAXSIZE)
103 return -1;
104 return ss->data[ss->top2++];
105 }
106 return -1;
107 }
运行结果
- oracle 12c 常见报告获取-AWR
- 人人公司收购美国卡车社区 Trucker Path,未来或探索无人驾驶
- WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[下篇]
- 《WCF的绑定模型》博文系列汇总[共6篇]
- 快来看看难民营里的高科技超市
- WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[中篇]
- 如何通过自定义MessageFilter的方式利用按键方式操作控件滚动条[附源代码]
- WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(下篇)
- 《WCF技术剖析》博文系列汇总[持续更新中]
- 关于服务器的运行寿命 你应该知道这些事
- WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[下篇]
- WCF技术剖析之二十一: WCF基本的异常处理模式[上篇]
- 树大招风:细数2017年加密货币市场的幺蛾子事件
- 如何解决HP QC(Quality Center)在Windows 7下不能工作的问题
- 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 数组属性和方法
- YII2.0框架行为(Behavior)深入详解
- php数组函数array_push()、array_pop()及array_shift()简单用法示例
- PHP+MySQL+sphinx+scws实现全文检索功能详解
- php封装的page分页类完整实例代码
- Thinkphp自定义生成缩略图尺寸的方法
- Yii框架中使用PHPExcel的方法分析
- 详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
- Laravel框架自定义分页样式操作示例
- 使用composer 安装 laravel框架的方法图文详解
- laravel5.6 框架操作数据 Eloquent ORM用法示例
- Python版名片管理系统
- docker-compose部署php项目实例详解
- Linux下通过sed命令对kv方式的配置文件进行修改
- laravel5.6框架操作数据curd写法(查询构建器)实例分析
- PHP基于timestamp和nonce实现的防止重放攻击方案分析