使用一维数组实现共享栈操作

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

结构图如下:

//函数根据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;
}

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

原文地址:https://www.cnblogs.com/jearchen/p/9884876.html

时间: 2024-10-16 18:35:05

使用一维数组实现共享栈操作的相关文章

多栈共享技术,双端栈的初始化、进栈、出栈操作

栈的应用非常广泛,经常会出现一个程序中需要同时使用多个栈的情况.若使用顺序栈,会因为对栈空间大小难以准确估计,从而产生有的栈溢出.有的栈空间还很空闲的情况.为了解决这个问题,可以让多个栈共享一个足够大的数组空间,通过利用栈的动态特性来使其存储空间互相补充,这就是多栈的共享技术. 在顺序栈的共享技术中,最常用的是两个栈的共享技术,即双端栈.它主要利用了栈的栈底位置不变,而栈顶位置动态变化的特性. 实现代码如下: #include<iostream> using namespace std; #d

对N个数组进行操作。先把这N个一维数组合并成一个2为数组;然后进行操作

using System;using System.Collections.Generic;using System.Linq;using System.Collections;using System.Text;using System.Diagnostics; namespace Hecha.Test{ class Program { static void Main(string[] args) { List<string>[] aa = new List<string>[5

c语言操作一维数组-3

C语言选择题#includemain(){double a[15],k;k=fun(a);} 则以下选项中错误的fun函数首部是 ( D)A.double fun(double a[15]) B.double fun(double *a)C.double fun(double a[]) D.double fun(double a)------------------------------------------------ http://blog.csdn.net/jin13277480598

数据结构_线性表_顺序存储之1顺序栈2共享栈_链式存储之链栈_栈的应用举例

1>//栈是先进后出,后进先出的线性表 简称LIFO线性表 //栈的顺序存储结构成为顺序栈(sequebtial stack). //顺序栈利用一组地址连的存储单元依次存放从栈底到 栈顶的数据元素,通常用一维数组存放栈的元素 //"指针"top并非指针,而是表示栈顶元素的当前位置 //top不是指针型变量而是整形变量,top=0空栈,top=MaxSize 表示满栈,当top>maxsize 表示栈溢出 代码 #include <stdio.h> #includ

[java学习笔记]java语言基础概述之数组的定义&amp;常见操作(遍历、排序、查找)&amp;二维数组

1.数组基础 1.什么是数组:           同一类型数据的集合,就是一个容器. 2.数组的好处:           可以自动为数组中的元素从零开始编号,方便操作这些数据. 3.格式:  (一旦创建,必须明确长度)          格式1:              元素类型   [ ]  数组名  =  new  元素类型  [元素个数即数组的长度]:              示例:int[] array = new int[5];          格式2:           

_DataStructure_C_Impl:共享栈

// _DataStructure_C_Impl:共享栈 #include<stdio.h> #include<stdlib.h> #define StackSize 100 typedef char DataType; //两个共享栈的数据结构类型定义 typedef struct { DataType stack[StackSize]; int top[2]; }SSeqStack; //共享栈的初始化操作 void InitStack(SSeqStack *S){ S->

函数、内存、一维数组、二维数组【4】

  函数的定义 什么是函数? •函数就是定义在类中的具有特定功能的一段独立小程序. •函数也称为方法. 函数的格式: •修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,...)   {   执行语句;   return 返回值;   }   返回值类型:函数运行后的结果的数据类型.   参数类型:是形式参数的数据类型.   形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数.   实际参数:传递给形式参数的具体数值.   return:用于结束函数.   返回值

栈操作之顺序栈

数据结构: 栈是允许在同一端进行插入和删除操作的特殊线性表.允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom):栈底固定,而栈顶浮动:栈中元素个数为零时称为空栈.插入一般称为进栈(PUSH),删除则称为退栈(POP).栈也称为后进先出表. 操作系统: 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈 栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放. 具体操作有:初始化 判断栈满 判断栈空 push po

java数组(一维数组,二维数组)

数组初始化: 1,动态初始化:数组定义与为数组分配空间和赋值的操作分开进行 2,静态初始化:在定义数组的同时就为数组元素分配空间并赋值 3,默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此,数组分配空间之后 每个元素也被按照成员的规则被隐士的初始化值 ------------------------------------------------. 一维数组: package day06; import java.util.Date; /*** * 数组演示 * 数组的声明: * t