前言
- 个人推荐在牛客网刷题(点击可以跳转),主要它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。
- 个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 牛客数据结构题目位置如下:
问题描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
- 0<=pushV.length == popV.length <=1000
- -1000<=pushV[i]<=1000
- pushV 的所有数字均不相同
输入描述:
[1,2,3,4,5],[4,5,3,2,1]
输出描述:
true/false
举例:
//输入:
[1,2,3,4,5],[4,5,3,2,1]
//输出:
true
//输入:
[1,2,3,4,5],[4,3,5,1,2]
//输出:
false
- 自己思路:开辟一个新栈进行比较,模拟入栈出栈的过程。
按入栈表中顺序进行入栈操作,每入栈一次,就和出栈表中的首个元素进行比较,
如果相同,则出栈,并指向出栈表的下一个元素,如果不同,则继续入栈。
到全部入栈表中元素访问完毕时,将以新栈栈顶和出栈表的表头元素比较。 - 整个思路正确,但查看了别人的代码简介凝练,主要是思路是使用数组实现栈过程,省去了申请堆内存的过程。
- 因此,这样看来,数据结构栈作为一种数据结构关系,更多的是一种数据间关系的思想,而不必拘泥于标准的实现过程,应该以使用该种思想来解决实际问题为目标。
代码结果:
#include <stdbool.h>
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* @param pushV int整型一维数组
* @param pushVLen int pushV数组长度
* @param popV int整型一维数组
* @param popVLen int popV数组长度
* @return bool布尔型
*/
bool IsPopOrder(int* pushV, int pushVLen, int* popV, int popVLen )
{
if(pushVLen!=popVLen)//长度不等就没必要尝试了,直接判为否
return false;
else
{
int top=-1,top_in=0,top_out=0;//以pushV为辅助栈,top为栈顶指针,top_in为入栈数组pushV的指针,top_out为出栈数组popV的指针
while(top_in<pushVLen && top_out<pushVLen)
{
while(top_in<pushVLen && pushV[top_in]!=popV[top_out])
{
//与当前出栈数组元素对应的入栈数组元素前的所有数入栈
pushV[++top]=pushV[top_in];
top_in++;
}
//已到达出栈数组元素与入栈元素相对应的位置
pushV[++top]=popV[top_out];
top_in++;
while(top>-1 && pushV[top]==popV[top_out])//出栈,出栈后还要继续匹配出栈数组的下一个元素,直至不能相对后又开始入栈
{
//栈顶元素若与出栈数组元素相等就出栈
top--;
top_out++;
}
}
//遍历结束
return top==-1?true:false;//栈不为空,没能出栈匹配完成,匹配失败
}
}
结束语
- 以上就是有效括号序列的内容。可以在牛客尝试刷几道单链表题目来练习实践。牛客网刷题(点击可以跳转),可以尝试注册使用。