zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    eclipse如何卸载adt插件
    Android中的Toast.LENGTH_SHORT
    Frogger
    - Oil Deposits 深搜,就是所谓的dfs
    Aggressive cows
    Phone List
    Word Amalgamation
    Street Numbers
    Charm Bracelet——背包问题
    函数参考
  • 原文地址:https://www.cnblogs.com/AKsnoopy/p/7270155.html
Copyright © 2011-2022 走看看