大话数据结构系列之共享栈结构(八)

共享栈定义

共享栈图解
在这里插入图片描述

推理
它们是在数组的两端,向中间靠拢。top1 和 top2 是栈 1 和栈 2 的栈顶指针,可以想象,只要它们俩不见面,两个栈就可以一直使用。

优点
理论上适用一块儿地儿,办了两块地儿的事儿,节省了 1/2 的空间。

适用情景
比较适用于两个栈的空间需求有相反关系的情况,也就是一个栈增长时,另一个栈在缩短。
跟买股票一样,你买入时,一定是有一个你不知道的人在做卖出操作。

实际例子:线程还是协程(有栈的),共享一块儿内存空间

共享栈代码实现( C、Java)

C 语言实现

#include "stdio.h"    
#include "stdlib.h"   
#include "math.h"  
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存储空间初始分配量 */

typedef int Status; 

typedef int SElemType; /* SElemType类型根据实际情况而定,这里假设为int */


/* 两栈共享空间结构 */
typedef struct 
{
        SElemType data[MAXSIZE];
        int top1;   /* 栈1栈顶指针 */
        int top2;   /* 栈2栈顶指针 */
}SqDoubleStack;


Status visit(SElemType c)
{
        printf("%d ",c);
        return OK;
}

/*  构造一个空栈S */
Status InitStack(SqDoubleStack *S)
{ 
        S->top1=-1;
        S->top2=MAXSIZE;
        return OK;
}

/* 把S置为空栈 */
Status ClearStack(SqDoubleStack *S)
{ 
        S->top1=-1;
        S->top2=MAXSIZE;
        return OK;
}

/* 若栈S为空栈,则返回TRUE,否则返回FALSE */
Status StackEmpty(SqDoubleStack S)
{ 
        if (S.top1==-1 && S.top2==MAXSIZE)
                return TRUE;
        else
                return FALSE;
}

/* 返回S的元素个数,即栈的长度 */
int StackLength(SqDoubleStack S)
{ 
        return (S.top1+1)+(MAXSIZE-S.top2);
}

/* 插入元素e为新的栈顶元素 */
Status Push(SqDoubleStack *S,SElemType e,int stackNumber)
{
        if (S->top1+1==S->top2) /* 栈已满,不能再push新元素了 */
                return ERROR;   
        if (stackNumber==1)         /* 栈1有元素进栈 */
                S->data[++S->top1]=e; /* 若是栈1则先top1+1后给数组元素赋值。 */
        else if (stackNumber==2)    /* 栈2有元素进栈 */
                S->data[--S->top2]=e; /* 若是栈2则先top2-1后给数组元素赋值。 */
        return OK;
}

/* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
Status Pop(SqDoubleStack *S,SElemType *e,int stackNumber)
{ 
        if (stackNumber==1) 
        {
                if (S->top1==-1) 
                        return ERROR; /* 说明栈1已经是空栈,溢出 */
                *e=S->data[S->top1--]; /* 将栈1的栈顶元素出栈 */
        }
        else if (stackNumber==2)
        { 
                if (S->top2==MAXSIZE) 
                        return ERROR; /* 说明栈2已经是空栈,溢出 */
                *e=S->data[S->top2++]; /* 将栈2的栈顶元素出栈 */
        }
        return OK;
}

Status StackTraverse(SqDoubleStack S)
{
        int i;
        i=0;
        while(i<=S.top1)
        {
                visit(S.data[i++]);
        }
        i=S.top2;
        while(i<MAXSIZE)
        {
                visit(S.data[i++]);
        }
        printf("\n");
        return OK;
}

int main()
{
        int j;
        SqDoubleStack s;
        int e;
        if(InitStack(&s)==OK)
        {
                for(j=1;j<=5;j++)
                        Push(&s,j,1);
                for(j=MAXSIZE;j>=MAXSIZE-2;j--)
                        Push(&s,j,2);
        }

        printf("栈中元素依次为:");
        StackTraverse(s);

        printf("当前栈中元素有:%d \n",StackLength(s));

        Pop(&s,&e,2);
        printf("弹出的栈顶元素 e=%d\n",e);
        printf("栈空否:%d(1:空 0:否)\n",StackEmpty(s));

        for(j=6;j<=MAXSIZE-2;j++)
                Push(&s,j,1);

        printf("栈中元素依次为:");
        StackTraverse(s);

        printf("栈满否:%d(1:否 0:满)\n",Push(&s,100,1));

        
        ClearStack(&s);
        printf("清空栈后,栈空否:%d(1:空 0:否)\n",StackEmpty(s));
        
        return 0;
}

Java 语言实现

package com.example.stack;

/* 两栈共享空间结构 */
public class SqDoubleStack<T> {
    
    /* 存储空间初始分配量 */
    int maxsize=20; 
    
     /* 数组,存储数据元素 */
    Object[] values = new Object[20];
    
    /* 线性表当前长度 */
    int length;
    
    /* 栈1栈顶指针 */
    int top1; 
    
    /* 栈2栈顶指针 */
    int top2;
    
    /*  构造一个空栈S */
    int initStack(){
     this.top1 = -1;
     this.top2 = maxsize;
     return 1;  
    }
    
    /* 把S置为空栈 */
    int clearStack(){
        this.top1 = -1;
         this.top2 = maxsize;
         return 1;  
    }
    
    /* 若栈S为空栈,则返回TRUE,否则返回FALSE */
    boolean stackEmpty(){
        if( this.top1 == -1 && this.top2 == this.maxsize)
            return true;
        else
            return false;
    }
    

    /* 返回S的元素个数,即栈的长度 */
    int stackLength(){
        return (this.top1 + 1) + (this.maxsize - this.top2);
    }
    
    
    /* 插入元素e为新的栈顶元素 */
    int push(T elem,int stackNumber){
        if(this.top1 + 1== this.top2){
            System.out.println("栈已满,不能再push新元素了!");
            return -1;
        }
        if(stackNumber == 1)
            this.values[++this.top1] = elem;
        else if(stackNumber ==2)
            this.values[--this.top2] = elem;
        else
            System.out.println("stackNumber有误!");
        return 1;
    }
    
    @SuppressWarnings("unchecked")
    /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
    T pop(int stackNumber){
        if(stackNumber == 1){
            if(this.top1 == -1)
                throw new NullPointerException();
            return (T)this.values[this.top1--];
        }else if(stackNumber == 2){
            if(this.top2 == this.maxsize)
                throw new NullPointerException();
            return (T)this.values[this.top2++];
        }else
            System.out.println("stackNumber有误!");
        return null;
    }
    
    /* 从栈底到栈顶依次对栈中每个元素显示 */
    void stackTraverse(){
        int i =0;
        while (i <= this.top1){
            System.out.println(this.values[i++]);
        }
        i = this.top2;
        while (i < this.maxsize){
            System.out.println(this.values[i++]);
        }
    }
    
    public static void main(String[] args){
        int j;
        SqDoubleStack<Integer> s = new SqDoubleStack<Integer>();
        if(s.initStack() == 1)
        {
                for(j=1;j<=5;j++)
                        s.push(j,1);
                for(j=s.maxsize;j>=s.maxsize-2;j--)
                        s.push(j,2);
        }

        System.out.println("栈中元素依次为:");
        s.stackTraverse();

        System.out.println("当前栈中元素有:%d \n"+s.stackLength());

        
        System.out.println("弹出的栈顶元素 e=%d\n"+s.pop(2));
        System.out.println("栈空否:%d(1:空 0:否)\n"+s.stackEmpty());

        for(j=6;j<=s.maxsize-2;j++)
                s.push(j,1);

        System.out.println("栈中元素依次为:");
        s.stackTraverse();

        System.out.println("栈满否:%d(1:否 0:满)\n"+s.push(100,1));
        
        s.clearStack();
        System.out.println("清空栈后,栈空否:%d(1:空 0:否)\n"+s.stackEmpty());
    }
    
}
发布了222 篇原创文章 · 获赞 54 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/weixin_39966065/article/details/104021729
今日推荐