原创

栈的入栈,出栈序列问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41308027/article/details/89057926

问题(1)

(1)一个栈的入栈序列是A,B,C,D,E,则出栈序列不可能是?()
A、 EDCBA
B、 DECBA
C、DCEAB
D、ABCDE

答案:C

(2)若进栈序列为1,2,3,4假定进栈和出栈可以穿插进行,则可能的出栈序列是()
A、 2,4,1,3
B、 3,4,1,2
C、1,2,3,4
D、3,1,4,2

答案:C

题目隐含的意思,进栈与出栈的顺序,时机任意,且不限次数

上面两题看起来像是不一样的题目,其实是一样的意思;
1,2,3,4可以和A,B,C,D等同
先给它们每个元素(不管是数字还是字符串)标个序号,后面直接对序号操作就OK了【按照1,2,3,…,n的顺序】

解题思路:
已知栈的输入序列是1,2,3,…,n,输出序列是a1,a2,…ai,…,an。
然后我们任选一个数ai,并筛选ai到an之间所有<=ai的元素,则它们一定是按照从大到小的顺序排列的。

(“从大到小“不一定紧紧相邻,只代表相对位置关系,比如(…,10,…,7,…,3,…,1,…)
举例:
入栈顺序:1 2 3 4 【n=4】
出栈顺序:3 2 1 4
验证:
让i=1,那么ai=3,后面小于3的有2,1。刚好3,2,1是按照从大到小的顺序排列的
让i=2,那么ai=2,后面小于2的有1。刚好2,1是按照从大到小的顺序排列的
让i=3,那么ai=1,后面小于1的有NULL,满足。
让i=4,没用小于4的满足,NULL

** [不充分条件]**


问题(2)

栈的压入,弹出序列

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

(摘自剑指offer)

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        if(pushV.empty()) return false;
        vector<int> stack;
        for(int i=0,j=0;i<pushV.size();)   // i=j=0 不行
        {
            stack.push_back(pushV[i++]);
            while(j<popV.size() && stack.back()==popV[j])
            {
                stack.pop_back();
                j++;
            }
        }
        return stack.empty();
    }
};
展开阅读全文

请教和销毁问题

08-24

#include rn#include rn#define STACK_INIT_SIZE 100rnrntypedef struct Stackrn int *base;rn int *top;rn int Stack_Size;rnsqStack;rnrnrnrnint Stack_Create(sqStack *q)rnrn q->base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));rn if(!(q->base))exit(0);rn q->top=q->base;rn q->Stack_Size=STACK_INIT_SIZE;rnreturn 0;rnrnrnrnint Stack_Push(sqStack *q,int e)rnrnrn if(q->top - q->base >= q->Stack_Size)rn rn q->base=(int*)realloc(q->base,q->Stack_Size+STACK_INIT_SIZE*sizeof(int));rn q->top=q->base+STACK_INIT_SIZE;rn q->Stack_Size=q->Stack_Size+STACK_INIT_SIZE;rn rn*(q->top)=e;rn printf("q->top=%d\n",*(q->top));rn++q->top;rnrnreturn 0;rnrnrnrnrnint Stack_Pop(sqStack *q,int u)rnrn --q->top;rn u=*(q->top);rn printf("u is:%d\n",u);rnreturn u;rnrnrnrnrnvoid Stack_Clear(sqStack *q)rnrn q->top=q->base;rnrnrnvoid Stack_Destory(sqStack *q)rnrn int len=q->Stack_Size;rn for(int i=0;ibase);rn q->base++;rn rn q->base=q->top=NULL;rn q->Stack_Size=0;rnrnrnrnrnrnrnint main()rnrn sqStack* s1;rn int t=0;rn Stack_Create(s1);rn Stack_Push(s1,89);rn Stack_Pop(s1,t);rn Stack_Clear(s1);rn Stack_Destory(s1);rnrnreturn 0;rnrnrn疑问:rn 1.这个代码是关于创建一个栈,以及入栈和出栈的函数,最后是销毁的函数;在这个代码中,我不明白的是Stack_Push(sqStack *q,int e)函数中红色标注的这一项:q->top=q->base+STACK_INIT_SIZE;因为在这句代码的上一行中,使用realloc函数重新分配内存空间,返回的地址赋值给q->base;那么,q->base应该就是指向新分配空间的首地址,既然指向首地址,那么q->top指针的位置就不应该是q->top=q->base+STACK_INIT_SIZE; (因为这个push函数的目的是使用realloc增加一块内存,增加之后,把top仍然设置为栈顶指针),这样的话如果要将q->top仍将设置为栈顶指针,那么q->base就必须是在原位置的地址+新增加的内存(即:STACK_INIT_SIZE),但是q->base不是原位置的地址,而是新内存的首地址(我觉得q->top指针应该是:原q->base位置+STACK_INIT_SIZE,即:q->base(此时q->base在新内存的首地址也即栈底)+Stack_Size+STACK_INIT_SIZE);所以这个地方我觉得很奇怪。rnrn 2.我在运行这个程序的时候,编译没有问题,但是在运行的时候提示在free释放的时候错了,我使用gdb调试,最后发现在Stack_Destory(s1)这个函数这里出现错误:rnrnBreakpoint 1, main () at stack1.c:77rn77 int t=0;rn(gdb) nextrn78 Stack_Create(s1);rn(gdb) nextrn79 Stack_Push(s1,89);rn(gdb) nextrnq->top=89rn80 Stack_Pop(s1,t);rn(gdb) nextrnu is:89rn82 Stack_Destory(s1);rn(gdb) nextrnstack1(1500,0x7fff7c568310) malloc: *** error for object 0x100200004: pointer being freed was not allocatedrn*** set a breakpoint in malloc_error_break to debugrnrnProgram received signal SIGABRT, Aborted.rn0x00007fff97c28866 in ?? ()rn不是很懂销毁的时候,难道free错了? 麻烦高手指点迷津 论坛

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

博客模板©2019 由CSDN提供 模版主题为:skin-technology by CSDN官方博客 设计