7 线性表-栈-顺序存储的拓展-迎面增长的存储方式

描述:
设有两个栈,S1和S2,都采用顺序栈的存储方式。
两个栈共享一个存储区:【0,……maxsize-1】
目的:可以尽量利用空间,减少溢出的可能,采用栈顶相向、迎面增长的存储方式

PS:要注意判断栈满栈空的检查

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define maxsize 100

/*栈结构的定义*/
typedef struct
{
    int stackk[maxsize];
    int top[2];//两个栈顶指针top[0]指向stackk左端,top[1]指向stackk右端
    int length[2];
} stk;
/*入栈*/
/*i表示两个不同的栈,0表示左边的栈,1表示右边的栈
左边的栈每入栈一个元素指针向右移动,右边的栈每入栈一个元素指针向左移动
入栈操作前要判断栈是否为满
*/
void initStackk(stk *S)
{
    S->length[0]=0;
    S->length[1]=0;
    S->top[0]=-1;
    S->top[1]=maxsize;
}
int Push(int i,int x,stk *S)
{
    if(i!=0&&i!=1)
    {
        cout<<"wrong stack number"<<endl;
        return 0;
    }
    else if(S->top[0]==(S->top[1]-1))
    {
        cout<<"the stack is filled with data";
        return 0;
    }
    if(i==0)
    {
        S->stackk[++S->top[0]]=x;
        S->length[i]++;
    }
    else
    {
        S->stackk[--S->top[1]]=x;
        S->length[i]++;
    }
    cout<<"Successful."<<endl;
    return 1;
}
int Pop(int i,int &x,stk *S)
{
    if(i!=0&&i!=1)
    {
        cout<<"wrong stack number"<<endl;
        return 0;
    }
    if(S->top[i]==-1||S->top[i]==maxsize)
    {
        cout<<"Stack"<<i<<" is null.";
        return 0;
    }
    if(i==0)
    {
        x=S->stackk[S->top[i]--];
        S->length[i]--;
    }
    else
    {
        x=S->stackk[S->top[i]++];
        S->length[i]--;
    }
    cout<<"Successful."<<endl;
    return 1;
}
void showtheStack(stk *S)
{
    cout<<"Stack0 : ";
    for(int i=0; i<S->length[0]; i++)
        cout<<S->stackk[i]<<" ";
    cout<<endl;
    cout<<"Stack1 : ";
    for(int i=maxsize-1,j=0; j<S->length[1]; j++,i--)
    {
        cout<<S->stackk[i]<<" ";
    }
    cout<<endl;
}
int main()
{
    stk *S=(stk*)malloc(sizeof(stk));
    initStackk(S);
    cout<<"test function ‘Push‘ by input 5 data."<<endl;
    int w=5;
    while(w--)
    {
        cout<<"input a data and which stack that you want to save";
        int a,b;
        cin>>a>>b;

        if(!Push(b,a,S))
        {
            w++;
        }
    }
    showtheStack(S);
    cout<<"test function ‘Pop‘ by input the stack number."<<endl;
    w=3;
    while(w--)
    {
        int out=-1;
        cout<<"input a stack number (0/1):";
        int in;
        cin>>in;
        if(!Pop(in,out,S))
        {
            w++;
        }
        if(out>0)
        {
            cout<<"you Pop the data "<<out<<" successful from stack"<<in<<"."<<endl;
        }
    }
    showtheStack(S);
    return 0;
}
时间: 2024-10-10 11:02:16

7 线性表-栈-顺序存储的拓展-迎面增长的存储方式的相关文章

6 线性表-栈-顺序存储

自己简直是强迫症晚期,上次因为对访问结构体成员该用什么方法困惑了很久,导致没把顺序存储的捣鼓出来(明明比链式的要好写) 今天花了个20分钟调好了 因为今天比较晚,赶时间就没给类型起别名用ElemType写,直接用了int类型.需要的话可以自行更改. 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<iostream> 4 using namespace std; 5 #define maxsize 50 6 /*顺序

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

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

线性表的顺序存储结构和链式存储结构

前言 上一篇<栈>中提到了栈的顺序存储结构和链式存储结构,现在就对此做个简单的比较.因为栈是线性表的一种,顺序存储结构和链式存储结构实际是线性表的两种存储方式.而栈和队列都是两种重要的线性表结构.所以本文标题直接为线性表的顺序存储结构和链式存储结构. 开始比较两种不同的存储方式 一.顺序存储结构(也可称为顺序表) 顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 优点: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑

线性表的顺序存储结构

1.顺序表: 线性表占用的存储空间=n*sizeof(ElemType) n为线性表的长度,ElemType为线性表的元素类型,sizeof(ElemType)为每个元素所占存储空间大小(即字节数) 线性表的顺序存储结构利用数组实现,数组的基本类型是线性表中元素类型,数组大小大于等于线性表的长度. 基本运算实现: (1)建立顺序表 void CreateList(SqList *&L,ElemType a[],int n)    //由a中的n个元素建立顺序表 {  int i;    L=(S

线性表之顺序存储结构实现(上)

一,线性表的概念以及数学定义 1.线性表的概念 零个或多个数据元素的有限序列.首先说明这是一个序列,也就是说数据元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且仅有一个前驱和后继. 2.数学定义 若将线性表记为(a1...ai-1,ai,ai+1....an),则线性表中,ai-1领先于ai,ai领先于ai+1,则称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素,当i=1,2....n-1的时候,ai有且仅有一个直接后继元素,当i=2,3

线性表之顺序存储结构(C语言动态数组实现)

线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链式存储结构:是用一段一段连续的内存空间存储表中每一行的数据,段与段之间通过一个引用(指针)相互连接来,形成一个链式的存储结构 看到顺序存储结构的图示,我们可能会马上联想到C语言的数组.是的,数组就是一种典型的顺序存储数据结构.下面我通过一个实例,来实现对顺序存储结构中的数据增.删.改.查的操作. 首

线性表的顺序存储结构之顺序表类的实现_Java

在上一篇博文--线性表接口的实现_Java中,我们实现了线性表的接口,今天让我们来实现线性表的顺序存储结构--顺序表类. 首先让我们来看下顺序表的定义: 线性表的顺序存储是用一组连续的内存单元依次存放线性表的数据元素,元素在内存的物理存储次序与它们在线性表中的逻辑次序相同,即元素ai与其直接前驱ai-1及直接后继ai+1的存储位置相邻.顺序存储的线性表也成为顺序表(sequential list). 顺序表类SeqList提供线性表基于顺序存储结构的一种实现,它有两个私有成员变量table和n,

02.线性表(一)顺序存储结构

顺序存储结构 一.线性表基本概念 1.线性表定义 线性表(list)是指零个或多个数据元素的有限序列,所有数据元素为相同数据类型且一个数据元素可以由多个数据项组成.若将线性表记为(a1,..ai-1,ai,ai+1...,an),线性表元素的个数n(n>0,n=0时为空表)定义为线性表的长度,其中ai-1是ai 的直接前驱元素,ai+1是ai的直接后继元素. 2.线性表的抽象数据类型 ADT 线性表(List) Data 线性表的数据对象集合为{a1,a2,....an},每个元素的类型均匀Da

数据结构之线性表之顺序存储结构(3)

1 前言 经过前两张的理论基础,我相信大家都能简单的明白了数据结构和算法一些常用的概念了,从今天开始我们开始学习数据结构中线性表,一起叩响数据结构的大门. 2 详述 线性表(List):零个或者多个数据元素的有限序列. 如果用数学语言来进行定义: (声明:由于下标不是很好弄出来,所以只能表示下面这种方式了,请见谅!) 若线性表记作(a1,...ai-1,ai,ai+1,...,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素.当i