共享栈
共享栈,即是两个栈使用同一段存储空间。
第一个栈从数组头开始存储,第二个栈从数组尾开始,两个栈向中间拓展。
当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:%d\n",n); 33 n=Pop(ss,2); 34 if(n>=0) 35 printf("the pop num is:%d\n",n); 36 n=Pop(ss,1); 37 if(n>=0) 38 printf("the pop num is:%d\n",n); 39 n=Pop(ss,1); 40 if(n>=0) 41 printf("the pop num is:%d\n",n); 42 n=Pop(ss,1); 43 if(n>=0) 44 printf("the pop num is:%d\n",n); 45 n=Pop(ss,1); 46 if(n>=0) 47 printf("the pop num is:%d\n",n); 48 n=Pop(ss,1); 49 if(n>=0) 50 printf("the pop num is:%d\n",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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2013-01-27 Oracle二三事之 EBS升级