zoukankan      html  css  js  c++  java
  • 使用一维数组实现共享栈操作

    所谓的共享栈就是两个虚拟的栈使用一块固定大小的数组元素,涉及到如何不冲突的进行入栈出栈操作。对一维数组即在数组两头设置两个栈顶标记(指针)。然后分别这两个进行入栈出栈操作。当前面的栈标记位置+1=后面栈的位置,那么不可以进行入栈操作,如果两个栈有在栈底(对前面的来说是top1-1,后一个是top2n)是不可以进行出栈操作的。
    结构图如下:

    //函数根据operate这个字符串内容是push还是pop,flag是1还是2表示是前面一部分栈还是后一部分栈,n表示共享栈stack_array[]数组的长度
    #include<iostream>
    #include<string>
    using namespace std;
    int top1,top2;//栈顶指针在整个过程是变化的,记录着两个栈栈顶位置,需要设置为全局变量
    char sharestack(char stack_array[],int top,int flag,string operate)
    {
        if(operate=="push")
        {
            if(flag==1)
            {
                char stack1_number;
                stack1_number='q';
                stack_array[top]=stack1_number;
                return 0;
            }
            if(flag==2)
            {
                char stack2_number;
                stack2_number='r';
                stack_array[top]=stack2_number;
                return 0;
            }
        }
        if(operate=="pop")
        {
            if(flag=1)
            {
                char stack1_popnumber;
                stack1_popnumber=stack_array[top];
                return stack1_popnumber;
            }
            if(flag=2)
            {
                char  stack2_popnumber;
                stack2_popnumber=stack_array[top];
                return stack2_popnumber;
            }
        }
    }
    int main()
    {
        
        char stack_array[10]={'0'};//初始化字符数组
        top1=-1;
        top2=10;//初始化1、2号栈栈顶指针
        //2号栈入栈基本操作,将top的变化放在main中执行,实现连续入栈或出栈。
        if(top1+1!=top2)//栈不满则入
        {
            top2=top2-1;
            sharestack(stack_array,top2,2,"push");
        }
        //2号栈入栈
        if(top1+1!=top2)
        {
            top2=top2-1;
            sharestack(stack_array,top2,2,"push");
        }
        cout<<"后面一个栈入一个元素:"<<stack_array[8]<<endl;
    
        //1号栈入栈
        if(top1+1!=top2)
        {
            top1=top1+1;
            sharestack(stack_array,top1,1,"push");
            cout<<"前面一个栈入一个元素:"<<stack_array[0]<<endl;
        }
    
        //2号栈出栈
        if(top2!=10)//出栈时2号栈的栈顶指针不为空是指不为(下标最大值+1)
        {
            char stack_pop_number;
            stack_pop_number=sharestack(stack_array,top2,2,"pop");
            top2=top2+1;
            cout<<"后面一个栈出一个元素"<<stack_pop_number<<endl;
        }
    
        //1号栈出栈
        if(top1!=-1)//一号栈出栈时基本栈顶指针不为下标(最小值0-1)
        {
            char stack_pop_number;
            stack_pop_number=sharestack(stack_array,top1,1,"pop");
            top1=top1-1;
            cout<<"前面一个栈出一个元素"<<stack_pop_number<<endl;
        }
        return 0;
    }
    


    在此次编写的过程中遇到不能进行连续代码入栈或者出栈的问题,在每次出入栈都要进行相应的数据操作,可以考虑将其封装在函数中。

  • 相关阅读:
    【JAVA SE基础篇】28.面向对象三大特征之多态
    【JAVA SE基础篇】27.面向对象三大特征之封装
    【JAVA SE基础篇】26.toString()方法和equlas()方法
    【JAVA SE基础篇】25.面向对象三大特征之继承
    【JAVA SE基础篇】24.包的机制和import详解
    ssh框架文件上传下载
    java格式化时间格式
    表单提交后打印后台传过来的数据
    使用ajaxfileupload.js实现文件上传
    JSTL跳出<c:forEach>循环
  • 原文地址:https://www.cnblogs.com/jearchen/p/9884876.html
Copyright © 2011-2022 走看看