栈的压入、弹出序列

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38131333/article/details/80696892

1. 问题描述

链接:https://www.nowcoder.com/questionTerminal/d77d11405cc7470d82554cb392585106
来源:牛客网
 

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

2. 解题思路

       借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这里是1,然后判断栈顶元素是不是出栈顺序的第一个元素,这里是4,很显然1≠4,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。

举例:

入栈1,2,3,4,5

出栈4,5,3,2,1

首先1入辅助栈,此时栈顶1≠4,继续入栈2

此时栈顶2≠4,继续入栈3

此时栈顶3≠4,继续入栈4

此时栈顶4=4,出栈4,弹出序列向后一位,此时为5,,辅助栈里面是1,2,3

此时栈顶3≠5,继续入栈5

此时栈顶5=5,出栈5,弹出序列向后一位,此时为3,,辅助栈里面是1,2,3

….

依次执行,最后辅助栈为空。如果不为空说明弹出序列不是该栈的弹出顺序。

 

3. 代码实现

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        if(pushV.empty() || popV.empty())
            return false;
        stack<int> s;
        int i=0,j=0;
        while(i<pushV.size())
        {
            s.push(pushV[i++]);
            while(j<popV.size() && s.top() == popV[j]){
                s.pop();
                ++j;
            }
        }
        return s.empty();
    }
};

 

 

 

 

 

 

 

 

写了栈的压入弹出的程序,弹出里的free错了,说是内存释放的问题,请问为什么错了?

12-24

typedef struct Node//节点类型rnrn int data;rn struct Node *pNext;rnrnNODE, *PNODE;rntypedef struct Stack//栈rnrn PNODE pTop;rn PNODE pBottom;rnrnSTACK,*PSTACK;rn//声明rnvoid init(PSTACK);//必须取地址为形参,残能改变其中的量rnvoid push(PSTACK, int);rnvoid traverse(PSTACK);rnbool pop(PSTACK, int *);rnbool empty(PSTACK);rnrnrnint main(void)rnrn STACK S;//STACK等价于struct STACKrn int val;rn init(&S);//初始化栈rn push(&S, 1);rn push(&S, 2);rn push(&S, 3);rn traverse(&S);rnrn if (pop(&S, &val))//val是弹出的数字,要跨函数使用此内存就要传地址。rn rn printf("出战成功%d\n", val);rn rn elsern rn printf("出战失败\n");rn rn traverse(&S);rn rn return 0;rnrnvoid init(PSTACK pS)rnrn pS->pTop = (PNODE)malloc(sizeof(PNODE));rn if (NULL == pS->pTop)rn rn printf("动态内存分配失败!\n");rn exit(-1);rn rn elsern rn pS->pBottom = pS->pTop;rn pS->pTop->pNext = NULL;rn rnrnrnvoid push(PSTACK pS,int val)rnrn PNODE pNew = (PNODE)malloc(sizeof(PNODE));//创建新节点rn pNew->data = val;//幅值数据区rn pNew->pNext =pS-> pTop;//指向顶端节点rn pS->pTop = pNew;//修改顶端指针rnrnrnrnrnvoid traverse(PSTACK pS)rnrn PNODE p = pS->pTop;rn while (p != pS->pBottom)rn rn printf("%d ", p->data);rn p = p->pNext;rn rn printf("\n");rn return;rnrnrnbool empty(PSTACK pS)rnrn if (pS->pTop == pS->pBottom)rn return true;rn elsern return false;rnrnbool pop(PSTACK pS, int *pVal)//好、跨函数使用内存,传地址rnrn if( empty(pS))rn rn return false;rn rn elsern rn PNODE r = pS->pTop;//要释放内存,就要先把这个记下来rn *pVal = r->data;rn pS->pTop = r->pNext;//下移ptoprn free(r);rn r = NULL;//这里错了,怎么改?rn return true;rnrn rn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试