zoukankan      html  css  js  c++  java
  • 共享栈

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

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

    当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);
     33     n=Pop(ss,2);
     34     if(n>=0)
     35         printf("the pop num is:%d
    ",n);
     36     n=Pop(ss,1);
     37     if(n>=0)
     38         printf("the pop num is:%d
    ",n);
     39     n=Pop(ss,1);
     40     if(n>=0)
     41         printf("the pop num is:%d
    ",n);
     42     n=Pop(ss,1);
     43     if(n>=0)
     44         printf("the pop num is:%d
    ",n);
     45     n=Pop(ss,1);
     46     if(n>=0)
     47         printf("the pop num is:%d
    ",n);
     48     n=Pop(ss,1);
     49     if(n>=0)
     50         printf("the pop num is:%d
    ",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("
    ");
     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 }

    运行结果

  • 相关阅读:
    ArrayList源码 (基于1.7)
    java.lang.Class类中的某些方法
    jdk1.8新特性 : 接口中可以有普通方法(非静态方法)和静态方法 , 颠覆了之前我的理解 : 接口中只能有共有常量和抽象方法的概念,后面必须要加一句jdk1.7和1..7之前
    Cesium中级教程10
    Cesium中级教程9
    Cesium中级教程8
    Cesium中级教程7
    Cesium中级教程6
    Cesium中级教程5
    Cesium中级教程4
  • 原文地址:https://www.cnblogs.com/xing901022/p/3534770.html
Copyright © 2011-2022 走看看