数据结构实验之栈与队列七:出栈序列判定

本文介绍了一个算法问题,即如何判断给定的序列是否为特定入栈序列的有效出栈序列。通过使用栈数据结构,文章提供了详细的实现代码,展示了如何进行序列的匹配验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Description

给一个初始的入栈序列,其次序即为元素的入栈次序,栈顶元素可以随时出栈,每个元素只能入栈依次。输入一个入栈序列,后面依次输入多个序列,请判断这些序列是否为所给入栈序列合法的出栈序列。

例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个出栈序列,但4,3,5,1,2就不可能是该序列的出栈序列。假设压入栈的所有数字均不相等。

Input

 第一行输入整数n(1<=n<=10000),表示序列的长度。

第二行输入n个整数,表示栈的压入顺序。

第三行输入整数t(1<=t<=10)。

后面依次输入t行,每行n个整数,表示要判断的每一个出栈序列。

Output

 对应每个测试案例输出一行,如果由初始入栈序列可以得到该出栈序列,则输出yes,否则输出no。

 

Example Input
5
1 2 3 4 5
2
4 5 3 2 1
4 3 5 1 2
Example Output
yes
no
code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERLOAD -2
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef struct 
{
    ElemType *base;
    ElemType *top;
    int stacksize;
}Sqstack;
void InitStack(Sqstack &s)//初始化栈
{
    s.base = (ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
    if(!s.base)
    {
        exit(OVERLOAD);
    }
    s.top = s.base;
    s.stacksize = STACK_INIT_SIZE;
}
int GetTop(Sqstack s, ElemType &e)
{
    if(s.top == s.base) return ERROR;
    e = *(s.top-1);
    return OK;
}
void Push(Sqstack &s, ElemType e)//入栈
{
    if(s.top-s.base>=s.stacksize)
    {
        s.base = (ElemType*)realloc(s.base, (s.stacksize+STACKINCREMENT)*sizeof(ElemType));
        if(!s.base) exit(OVERLOAD);
        s.top = s.base+s.stacksize;
        s.stacksize+=STACKINCREMENT;
    }
    *s.top++ = e;
}
int Pop(Sqstack &s, ElemType &e)//出栈,并将元素赋给e
{
    if(s.top == s.base) return ERROR;
    e = *--s.top;
    return OK;
}
int main()
{
    int n, i, t, j, k, e;
    int a[10010], b[10010];
    scanf("%d", &n);
    for(i = 0;i<n;i++)
    {
        scanf("%d", &a[i]);
    }
    scanf("%d", &t);
    while(t--)
    {
        Sqstack li;
        InitStack(li);
        j = 0, k = 0;
        for(i = 0;i<n;i++)
        {
            scanf("%d", &b[i]);
        }
        while(j<n)
        {
            if(a[k]==b[j])
            {
                k++;
                j++;
            }
            else if((li.top != li.base)&&*(li.top-1) == b[j])
            {
                j++;
                Pop(li, e);
            }
            else if(k<n)
            {
                Push(li, a[k]);
                k++;
            }
            else j++;
        }
        if(li.top==li.base) printf("yes\n");
        else printf("no\n");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值