共享栈
时间: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 }
运行结果
- 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 数组属性和方法
- Js 的事件循环(Event Loop)机制以及实例讲解
- 你不知道的js中关于this绑定机制的解析[看完还不懂算我输]
- 解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
- 算法-查找斐波纳契数列中第 N 个数
- 在python中修改.properties文件的操作
- Django Xadmin多对多字段过滤实例
- 算法-姓名去重
- Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
- Python Opencv中用compareHist函数进行直方图比较对比图片
- 面试题-树状数组结构转化
- Xadmin+rules实现多选行权限方式(级联效果)
- Android仿主流壁纸App设置界面
- Android中WindowManager与WMS的解析
- 算法(简单)_搜索二维矩阵&分解质因数
- 算法_最大子数组&合并排序数组