将编号为0和1的两个栈存放于一个数组空间V[m]中。

目录

1.题目描述

2.算法实现


1.题目描述

 

将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空;当第1号栈的栈顶指针top[1]等于m时该栈为空。两个栈均从两端向中间增长(见图)。试编写双栈初始化,判断栈空、栈满、进栈和出栈等算法的函数。

2.算法实现

 

#include<bits/stdc++.h>
#define MAXSIZE 100
using namespace std;

typedef struct
{
    int top[2],bot[2];  //栈顶和栈底指针
    int  *V;       //栈数组
    int m;          //栈最大可容纳元素个数
} DblStack;

int InitDblStack(DblStack &S)
{
    S.V=new int [S.m];
    S.m=MAXSIZE;
    S.top[0]=-1;
    S.top[1]=S.m;
    return 1;
}

int  isEmpty(DblStack &S)
{
    if(S.top[0]==-1&&S.top[1]==S.m)
        return 1;
    else return 0;
}

int  isFull(DblStack &S)
{
    if(S.top[1]-S.top[0]==-1||S.top[1]<0||S.top[0]>S.m-1)
        return 1;
    else return 0;
}

int  Push(DblStack &S,int i,int e)
{
    //i为栈号,i为0表示左栈,i=1表示右栈,e是入栈元素。

    if(i<0||i>1)
    {
        cout<<"栈号输入不对"<<endl;
        exit(0);
    }

    if(S.top[1]-S.top[0]==1)
    {
        cout<<"栈已满!";
        return 0;
    }
    switch(i)
    {
    case 0:
        {
        S.top[0]++;
        S.V[S.top[0]]=e;
        return 1;
        break;
        }
    case 1:
        {
        S.V[S.top[1]]=e;
        S.top[1]--;
        return 1;
        break;
        }
    }
}

int Pop(DblStack &S,int i)
{
    /*退栈。i代表栈号,i=0为左栈,i=1为右栈
    退栈成功时返回退栈元素*/
    if(i<0||i>1)
    {
        cout<<"栈号输入不对"<<endl;
        exit(0);
    }

    switch(i)
    {
    case 0:
        if(S.top[0]==-1)
        {
            cout<<"栈空!";
            return -1;
        }
        else return (S.V[S.top[0]]--);
    case 1:
        if(S.top[0]==S.m)
        {
            cout<<"栈空!";
            return -1;
        }
        else return (S.V[S.top[1]]++);
    }
}

void printDblStack(DblStack &S,int i)
{//遍历双栈,i为0遍历左栈,i为1遍历右栈
    switch(i)
    {
    case 0:
        {
             for(int i=0;i<S.top[0];i++)
        cout<<S.V[i]<<" ";
        }
    case 1:
        {
        for(int i=S.m;i<S.top[1];i--)
        cout<<S.V[i]<<" ";
        }
    }
    cout<<"\n";
}

void display()
{
    cout<<"   1.双栈初始化!\n\n"
        "   2.判断栈空!\n\n"
        "   3.判断栈满!\n\n"
        "   4.元素进栈!\n\n"
        "   5.元素出栈!\n\n"
        "   6.遍历双栈!\n\n"
        "   0.退出!\n\n";
}
int main()
{
    DblStack S;
    int i,e;
    bool a=true;
    display();
    while(a)
    {
        int n;
        cout<<"请输入序号:";
        cin>>n;
        switch(n)
        {
        case 1:
        {
            if(InitDblStack(S))
                cout<<"双栈初始化成功!\n\n";
            break;
        }
        case 2:
        {
            if(isEmpty(S)) cout<<"栈空!\n\n";
            else cout<<"栈非空!\n\n";
            break;
        }
        case 3:
        {
            if(isFull(S)) cout<<"栈满!\n\n";
            else cout<<"栈未满!\n\n";
            break;
        }
        case 4:
        {
            cout<<"输入0进左栈,1进右栈:";
            cin>>i;
            cout<<"请输入进栈元素:";
            cin>>e;
            if(Push(S,i,e))cout<<"元素进栈成功!\n\n";
            else cout<<"元素进栈成功!\n\n";
            break;
        }
        case 5:
        {
            cout<<"输入0出左栈,1出右栈:";
            cin>>i;
            cout<<"出栈元素是:"<<Pop(S,i)<<"\n\n";
            break;
        }
        case 6:
            {
                cout<<"输入0遍历左栈,1遍历右栈:";
                cin>>i;
                printDblStack(S,i);
                break;
            }
        case 0:
        {
            a=false;
            cout<<"已退出!\n\n";
            break;
        }
        }
    }
    return 0;
}

 

  • 14
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
以下是双初始化、判断空、满、进和出等算法的函数: ``` #include <stdio.h> #include <stdlib.h> #define ERROR -1 #define OK 1 typedef int SElemType; typedef struct { int top[2], bot[2]; // 顶和栈底指针 SElemType *V; // 数组 int m; // 最大可容纳元素个数 } DblStack; // 双初始化 int InitDblStack(DblStack *S, int m) { S->V = (SElemType *)malloc(m * sizeof(SElemType)); if (!S->V) { return ERROR; } S->top[0] = -1; S->bot[0] = 0; S->top[1] = m; S->bot[1] = m - 1; S->m = m; return OK; } // 判断空 int IsDblStackEmpty(DblStack S, int i) { if (i == 0) { return S.top[0] == -1; } else if (i == 1) { return S.top[1] == S.m; } else { return ERROR; } } // 判断满 int IsDblStackFull(DblStack S) { return S.top[0] + 1 == S.top[1]; } // 进 int PushDblStack(DblStack *S, int i, SElemType e) { if (IsDblStackFull(*S)) { return ERROR; } if (i == 0) { S->top[0]++; S->V[S->top[0]] = e; } else if (i == 1) { S->top[1]--; S->V[S->top[1]] = e; } else { return ERROR; } return OK; } // 出 int PopDblStack(DblStack *S, int i, SElemType *e) { if (IsDblStackEmpty(*S, i)) { return ERROR; } if (i == 0) { *e = S->V[S->top[0]]; S->top[0]--; } else if (i == 1) { *e = S->V[S->top[1]]; S->top[1]++; } else { return ERROR; } return OK; } int main() { DblStack S; int m = 10; InitDblStack(&S, m); PushDblStack(&S, 0, 1); PushDblStack(&S, 1, 2); SElemType e; PopDblStack(&S, 0, &e); printf("%d\n", e); PopDblStack(&S, 1, &e); printf("%d\n", e); return 0; } ``` 其,InitDblStack函数用于初始化双,IsDblStackEmpty函数用于判断空,IsDblStackFull函数用于判断满,PushDblStack函数用于进,PopDblStack函数用于出。在主函数,我们先初始化双,然后分别向两个压入元素,再从两个分别弹出元素并输出。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平卉陌路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值