共享栈

共享栈,即是两个栈使用同一段存储空间。

第一个栈从数组头开始存储,第二个栈从数组尾开始,两个栈向中间拓展。

当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 }
复制代码

运行结果

posted @   xingoo  阅读(8046)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 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升级
点击右上角即可分享
微信分享提示