美文网首页
栈的压入、弹出序列

栈的压入、弹出序列

作者: 一路向后 | 来源:发表于2022-04-13 22:39 被阅读0次

1.问题描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

  1. 0<=pushV.length == popV.length <=1000
  2. -1000<=pushV[i]<=1000
  3. pushV 的所有数字均不相同

2.源码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char *getArray(const char *buf, int *arr, int *n)
{
    const char *p = buf;
    char num[12];
    int i;

    while(*p != '[')
    {
        p++;
    }

    while(*n < 1001)
    {
        while(*p != '+' && *p != '-' && (*p < '0' || *p > '9'))
        {
            p++;
        }

        i = 0;

        if(*p == '+')
        {
            p++;
        }
        else if(*p == '-')
        {
            num[i] = '-';
            i++;
            p++;
        }

        if(*p < '0' || *p > '9')
        {
            return NULL;
        }

        while(*p >= '0' && *p <= '9' && i<11)
        {
            num[i] = *p;
            i++;
            p++;
        }

        while(*p != ']' && *p != 0x00 && *p != ' ' && *p != ',')
        {
            p++;
        }

        if(*p == ' ')
        {
            while(*p == ' ')
            {
                p++;
            }
        }

        if(*p == ']' || *p == ',')
        {
            num[i] = 0x00;

            arr[*n] = atoi(num);

            (*n)++;
        }

        i = 0;

        if(*p == ']' || *p == 0x00)
        {
            break;
        }
    }

    return p;
}

int main()
{
    char buf[512];
    int stack[3][1000];
    const char *p;
    int n = 0;
    int m = 0;
    int i;
    int j;
    int k;
    int w;

    memset(buf, 0x00, sizeof(buf));
    memset(stack, 0x00, sizeof(stack));

    fgets(buf, 511, stdin);

    p = getArray(buf, stack[0], &n);

    if(p == NULL)
    {
        return -1;
    }

    p = getArray(p+2, stack[1], &m);

    if(m != n)
    {
        return -1;
    }

    w = 0;

    for(i=0; i<n; i++)
    {
        while(1)
        {
            if(w && stack[2][w-1] == stack[1][i])
            {
                w--;
                break;
            }
            else
            {
                if(j < n)
                {
                    stack[2][w] = stack[0][j];
                    j++;
                    w++;
                }
                else
                {
                    break;
                }
            }
        }
    }

    if(w == 0)
    {
        printf("true\n");
    }
    else
    {
        printf("false\n");
    }

    return 0;
}

3.编译源码

$ gcc -o test test.c -std=c89

4.运行及其结果

$ ./test
[1,2,3,4,5],[4,5,3,2,1]
true

相关文章

  • 剑指offer-21~25

    21.栈的压入、弹出序列输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压...

  • 31:栈的压入、弹出序列

    题目31:栈的压入、弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断二个序列是否为该栈的弹出顺序。假...

  • 剑指offer.C++.code21-25

    21. 栈的压入、弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假...

  • 22 栈的压入、弹出序列 (栈混洗 stack permutat

    栈的压入、弹出序列 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出...

  • 《剑指offer》— JavaScript(21)栈的压入、弹出

    栈的压入、弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。...

  • 剑指offer刷题记录(C++版本)(之三)

    21.栈的压入,弹出序列 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出...

  • 面试题31. 栈的压入、弹出序列

    栈的压入、弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。...

  • JZ-021-栈的压入、弹出序列

    栈的压入、弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺...

  • 刷前端面经笔记(十一)

    1.栈的压入和弹出 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压...

  • 《剑指offer》(二十一)--栈的压入、弹出序列(java)

    栈的压入、弹出序列 考点:栈 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该...

网友评论

      本文标题:栈的压入、弹出序列

      本文链接:https://www.haomeiwen.com/subject/jkszsrtx.html