Swift处理堆栈问题——给定两组序列,其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序

题目:输入两个整数序列。其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序。
为了简单起见,我们假设push 序列的任意两个整数都是不相等的。
比如输入的push 序列是1、2、3、4、5,那么4、5、3、2、1 就有可能是一个pop 系列,但序列4、3、5、1、2 就不可能是push 序列1、2、3、4、5 的pop 序列。

分析:

我们首先定义遍历push的序数i=0  遍历pop序列的序数 j =0

我们可以先遍历给出的push序列,并且时刻与pop序列的头元素pop[j]进行比较

若找到与pop序列的头元素相同的push元素,则j向右移一位(移动完成后需要比较pop[j] 与当前的栈顶元素是不是相等,若相等则需要退出当前栈顶元素)

若push已经遍历完成,但是j依然小于 pop的元素个数,则我们只需要继续比较pop中剩余的元素与当前栈中的元素是不是对应的即可

代码:

func judgeStackOrder(var pushArray:Array<Int>,var popArray:Array<Int>)->Bool{

var tempStack = Stack<Int>()                  //构造一个tempStack的临时栈

if(pushArray == [] || popArray == []){

return false

}

if(pushArray.count != popArray.count){

return false

}

var i = 0,j = 0

for(i; i < pushArray.count ; i++){

println(i)

if(pushArray[i] != popArray[j]){

println(pushArray[i])

tempStack.push(pushArray[i])

}

else{

tempStack.push(pushArray[i])

tempStack.pop()

if(tempStack.top() == popArray[j+1]){

tempStack.pop()

j++

}

j++

}

}

if(j < popArray.count){

while( j < popArray.count ){

if(tempStack.top() != popArray[j] ){

println(tempStack.top())

popArray[j]

return false

}

else{

tempStack.pop()

j++

continue        //若当前栈顶元素等于当前j所处的pop序列的元素,则临时栈退栈,并且使j向右移动一个单位,跳入下一轮循环

}

}

return true

}

return false

}

//测试代码

var pushArray:Array<Int> = [1,3,5,7,9,8]

var popArray:Array<Int> = [3,1,9,8,7,5]

judgeStackOrder(pushArray, popArray)

时间: 2024-10-20 07:53:19

Swift处理堆栈问题——给定两组序列,其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序的相关文章

(hdu step 8.1.2)Train Problem I(站的基本应用——判断一个序列经过栈后是否能够得到第二个序列)

题目: Train Problem I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 78 Accepted Submission(s): 60   Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays. A l

给定两个字符串,获取两个字符串中最大相同的子串

1 package weekpratisce; 2 3 ///给定两个字符串,获取两个字符串中最大相同的子串 4 public class Demo9 { 5 public static void main(String[] args) { 6 String xx = "aaaaaaaaaaddddddd", yy = "45ddddda"; 7 String str = getMaxsubstring(xx, yy); 8 System.out.println(s

Oracle组函数、多表查询、集合运算、数据库对象(序列、视图、约束、索引、同义词)等

count组函数:(过滤掉空的字段) select count(address),count(*) from b_user max() avg() min(),sum() select sum(age),max(age),min(age),avg(nvl(age,0)) from b_user 1       260     70      10      37.1428571428571 group by:如果前面定义了该字段名  则groupby必须也写上该字段 select name,pw

【华为OJ】201301 JAVA 题目0-1级 将数组分为相等的两组

描述:  编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true:不满足时返回false. 知识点: 语言基础,字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归    题目来源: 内部整理  练习阶段: 初级  运行时间限制: 10Sec 内存限制: 128MByte 输入: 输入输入的数据个数 输入一个int型数组 输出: 返

【解答】一个电动模型,每一组电池能让其行驶8分钟,一个充电器能同时给两组电池充电,一组充满需要15分钟,至少准备(?)组电池,(?)个充电器,可以让模型每次行驶完可以立即换电池行驶不用等待。

阿里2015年实习生题目: 一个电动模型,每一组电池能让其行驶8分钟,一个充电器能同时给两组电池充电,一组充满需要15分钟,至少准备(?)组电池,(?)个充电器,可以让模型每次行驶完可以立即换电池行驶不用等待. 分析过程如下: 答案:至少3组电池,1组充电器可以立即换电池行驶不用等待.

两组有序数列的中位数

两组升序排列的数组A[m]和B[n], 求他们的中位数. 注意,中位数的概念哦-相信你会百度一下的- 格式: 第一行输入数字m,接下来一行输入数组A[m], 第三行输入数字n,第四行输入数组B[n],接下来输出中位数.两个数组的长度都不超过1000. 注意,需要保留5位小数哦-所以,你设计函数的时候请设计成double类型哦- 样例输入 1 3 5 1 2 4 5 6 样例输出 3.50000 package jsk; import java.util.Scanner; public class

Java中List和Map的特性对两组大批量数据进行匹配 (转)

在项目中遇到一个问题:要将通过http方式发送过来的大批量数据(这个数据保守估计每次请求在10万条左右),要和数据库中的另一批数据(数据库中的记录1万条左右)进行匹配(匹配:指两组数据中的某几个字段值相等),匹配上的数据保存在数据库中,匹配不上的直接扔掉.或者说:有一个List<String> strList,List<Person> personList,strNoList.size是1万,personList.size是10万, 然后要从personList中把person的i

给定两个32位的整数N和M,以及表示比特位置的i和j。编写一个方法,将M插入到N中, * 使得M从N的第j位开始,到第i位结束

1 /* 2 * 给定两个32位的整数N和M,以及表示比特位置的i和j.编写一个方法,将M插入到N中, 3 * 使得M从N的第j位开始,到第i位结束,假定从j位到i位足以容纳M,也即是M=10011 4 * 那么j和i之间至少可以容纳5个数,假如,不可能出现j=3,i=2的情况,因为第三位和第二位之间放不下M 5 * 例如 6 * N=1000000000(1024) 7 * M=10011(19) 8 * i=2,j=6,输出10001001100 9 * 思路如下: 10 * 1.将N中的从

9.6智力题(一)——给定两条绳子,每条绳子燃烧殆尽正好用一个小时,用这两条绳子准确计时15分钟

题目:给定两条绳子,每条绳子燃烧殆尽正好用一个小时,用这两条绳子准确计时15分钟. 注意:这些绳子密度不均匀,因此燃烧掉半截绳子不一定正好用时半个小时. 解答: 1)点燃绳子1一头的同一时候.将绳子2的两头点燃. 2)绳子2燃烧完时,正好过去30分钟. 3)将绳子1的另外一头点燃.開始计时. 4)15分钟后,绳子1燃烧完成.