随笔 - 147  文章 - 5  评论 - 6  阅读 - 81298

29. 栈的push,pop序列

题目:给定2个整数序列,其中1个是栈的push顺序,判断另一个有没有可能是对应的pop顺序

解:其实这题主要是判断进栈次数和出栈次数誓不是相等。我是用栈作的,效率不高,每一个元素最多出栈1次,进栈1此,所以最多进行2n次操作,然后每次对栈顶元素和pb指针指向的元素进行比较(因为假设序列中整数都不相等)

代码:

复制代码
/*
     判断栈push和pop顺序是否符合
     push中的元素顺序入栈,如果等于pb指向的元素,那么循环出栈,知道栈空或者pb元素和栈顶元素不一样,如果一样,出栈且pb++,总共的入栈出栈次数最多是2*n次
 */

#include<iostream>
using namespace std;
#define MAX 50

typedef struct 
{
    int data[MAX];
    int top;
}Stack;

Stack* create_stack(void)
{
    Stack* s=new Stack;
    if(s)
        s->top=-1;

    return s;
}

bool empty_stack(Stack* s)
{
    if(-1==s->top)
        return true;
    return false;
}

bool full_stack(Stack* s)
{
    if(MAX-1==s->top)
        return true;
    return false;
}

void push_stack(Stack* s,int value)
{
    if(full_stack(s))
        return ;
    s->top++;
    s->data[s->top]=value;
}

int pop_stack(Stack* s)
{
    if(empty_stack(s))
        return -1;
    int temp=s->data[s->top];
    s->top--;
    return temp;
}

int get_stack(Stack* s)
{
    if(empty_stack(s))
        return -1;
    return s->data[s->top];
}

void free_stack(Stack* s)
{
    if(s)
    {
        delete s;
        s=NULL;
    }
}

bool  satisfy(int *a,int *b,int n)
{
    int i=0;
    int pa,pb;
    Stack* s;


    pa=0;
    pb=0;
    s=create_stack();
    while(i++<2*n)
    {
        if(pa==n && pb==n)
            break;
        if(pa<n)
        {    
            push_stack(s,a[pa]);
            pa++;
        }

        while(!empty_stack(s) && get_stack(s)==b[pb])
        {
            pop_stack(s);
            pb++;
        }
    }

    bool flag;
    if(empty_stack(s) && pb==n)
        flag=true;
    else
        flag=false;
    free_stack(s);

    return flag;

}

int main(void)
{
    int a[MAX];
    int b[MAX];
    int n,i;

    cin>>n;

    for(i=0;i<n;i++)
        cin>>a[i];
    for(i=0;i<n;i++)
        cin>>b[i];
    
    cout<<boolalpha;
    cout<<satisfy(a,b,n)<<endl;

    return 0;
}
复制代码

 

posted on   紫金树下  阅读(230)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示