`
Iam42
  • 浏览: 275498 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

给定出栈序列和入栈序列,求出栈入栈顺序

 
阅读更多

亚马逊在线测评题:

大牛写的代码,学习一下编码风格

/* Enter your code here. Read input from STDIN. Print output to STDOUT */
import java.util.Scanner;
import java.util.StringTokenizer;

public class Solution 
{
	public String calculateOperationSequence(int[] originalArray, int[] resultArray) 
	{
		int[] numStackState = new int[originalArray.length];//0 have not pushed, 1 have pushed, 2 have poped
		for (int i = 0; i < numStackState.length; ++i) {
			numStackState[i] = 0;
		}
		StringBuffer result = new StringBuffer();
		for (int i = 0; i < resultArray.length; ++i) {
			int indexInOriginal = -1;
			for (int j = 0; j < originalArray.length; ++j) {
				if (originalArray[j] != resultArray[i]) {
					if (numStackState[j] == 0) {
						result.append("push");
						result.append(originalArray[j]);
						result.append("|");
						numStackState[j] = 1;
					}
				} else if (originalArray[j] == resultArray[i]) {
					if (numStackState[j] == 0) {
						result.append("push");
						result.append(originalArray[j]);
						result.append("|");
						numStackState[j] = 1;
					} else if (numStackState[j] == 2) {
						return "None";
					}
					indexInOriginal = j;
					break;
				}
			}
			if (indexInOriginal == -1) {
				return "None";
			}
			for (int j = indexInOriginal + 1; j < originalArray.length; ++j) {
				if (numStackState[j] == 1) {
					return "None";
				}
			}
			result.append("pop");
			result.append(resultArray[i]);
			result.append("|");
			numStackState[indexInOriginal] = 2;
		}
		return result.substring(0, result.length() - 1);
	}

	
	
	/**
	* StringTokenizer的用法(有点类似于split)
	 一、构造函数。
	1. StringTokenizer(String str) :构造一个用来解析str的StringTokenizer对象。java默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)”。
	2. StringTokenizer(String str, String delim) :构造一个用来解析str的StringTokenizer对象,并提供一个指定的分隔符。
	3. StringTokenizer(String str, String delim, boolean returnDelims) :构造一个用来解析str的StringTokenizer对象,并提供一个指定的分隔符,同时,指定是否返回分隔符。
	
	二、方法。
	说明:
	1. 所有方法均为public;
	2. 书写格式:[修饰符] <返回类型> <方法名([参数列表])>
	如:static int parseInt(String s) 表示:此方法(parseInt)为类方法(static),返回类型为(int),方法所需参数为String类型。
	1. int countTokens() :返回nextToken方法被调用的次数。如果采用构造函数1和2,返回的就是分隔符数量(例2)。
	2. boolean hasMoreTokens() :返回是否还有分隔符。
	3. boolean hasMoreElements() :结果同2。
	4. String nextToken() :返回从当前位置到下一个分隔符的字符串。
	5. Object nextElement() :结果同4。
	6. String nextToken(String delim) :与4类似,以指定的分隔符返回结果。
	* @param args
	*/
	public static void main(String[] args) 
	{
		Solution solution = new Solution();
		Scanner scanner = new Scanner(System.in);  //当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象。如果要获取输入的内容,则只需要调用Scanner的nextLine()方法即可。

		
		while (scanner.hasNextLine()) 
		{
			String strLine1 = scanner.nextLine();
			StringTokenizer stringTokenizer1 = new StringTokenizer(strLine1);
			
			//Initialize the original array
			int arrayLength = stringTokenizer1.countTokens();
			int[] originalArray = new int[arrayLength];
			for(int i = 0; i < arrayLength; i++)
			{
				originalArray[i] = Integer.parseInt(stringTokenizer1.nextToken());
			}
			
			//Initialize the result array
			String strLine2 = scanner.nextLine();
			StringTokenizer stringTokenizer2 = new StringTokenizer(strLine2);
			arrayLength = stringTokenizer2.countTokens();
			int[] resultArray = new int[arrayLength];
			for(int j = 0; j < arrayLength; j++)
			{
				resultArray[j] = Integer.parseInt(stringTokenizer2.nextToken());
			}
			
			String operationSequence = solution.calculateOperationSequence(originalArray, resultArray);
			System.out.println(operationSequence);
		}
	}
}

 

 

自己写的一个实现函数:

	private String calculateOperationSequence(int[] originalArray, int[] resultArray){
		StringBuffer rs = new StringBuffer();
		
		int[] numStackState = new int[originalArray.length];
		for(int i=0 ; i<numStackState.length ; i++){
			numStackState[i] = 0;
		}
		
		for(int i=0 ; i<resultArray.length ; ++i){
			for(int j=0 ; j<originalArray.length ; ++j){
				if(resultArray[i] != originalArray[j]){
					if(numStackState[j] == 0){
						numStackState[j]=1;
						rs.append("Push:"+originalArray[j]+";");
					}
				}else if(resultArray[i] == originalArray[j]){
					if(numStackState[j] == 0){
						rs.append("Push:"+originalArray[j]+";");
						rs.append("Pop:"+originalArray[j]+";");
						numStackState[j]=2;
						break;
					}else if(numStackState[j] == 1){
						if(numStackState[j+1] == 1){
							rs.append("出栈顺序不合法");
							return rs.toString();
						}else{
							rs.append("Pop:"+originalArray[j]+";");
							numStackState[j]=2;
							break;
						}
					}else{
						rs.append("出栈顺序不合法");
						return rs.toString();
					}
				}
			}	
		}
		
		return rs.toString();
	}

 

1
5
分享到:
评论

相关推荐

    给定进栈顺序,判断一个序列是否为正确的出栈顺序

    首先,我们考虑一个简单的例子,比如进栈顺序是 `[A, B, C]`,合法的出栈序列可能是 `[A, B, C]` 或 `[B, A, C]`,因为 `B` 在 `A` 之后入栈,所以它必须在 `A` 之前出栈;而 `C` 在最后入栈,因此它必须是最后一个...

    求出栈序列个数

    该问题的核心在于探索给定特定入栈顺序时,所有可能的不同出栈顺序的数量。 #### 二、问题分析 首先明确几个概念: - **入栈序列**:即元素进入栈的顺序。 - **出栈序列**:即元素离开栈的顺序。 - **栈**:一种...

    C++ 递归 输出所有出栈方案

    随后,程序读取这n个数字的入栈顺序,并计算出所有可能的出栈序列。 #### 示例 例如,当输入为: ``` 3 1 2 3 ``` 预期输出结果是所有可能的出栈序列: ``` 1: 1 2 3 2: 1 3 2 3: 2 1 3 4: 2 3 1 5: 3 2 1 ``` ##...

    出栈序列的研究 李红卫 徐亚平

    通过引入二叉树的概念,文章不仅给出了一种表示入栈和出栈序列的方法,还提出了一种时间复杂度为O(n)的高效算法用于判断给定序列是否为有效的出栈序列。 #### 二、出栈序列的总数 出栈序列的总数是一个经典的组合...

    输出N个元素的所有出栈可能

    标题中的“输出N个元素的所有出栈可能”指的是在计算机科学和数据结构领域,探讨一个栈(stack)数据结构中,当N个不同元素依次入栈后,如何确定所有可能的合法出栈序列。栈是一种遵循“后进先出”(Last In First ...

    栈的出栈顺序

    题目要求给出一个正整数n,求出所有可能的1到n的出栈序列。这个问题实际上是在考察如何通过递归算法来模拟栈的出入栈过程,并生成所有可能的出栈序列。 #### 三、核心算法分析 1. **定义状态**: - `kind`:当前...

    关于数据结构中出栈序列问题的讨论 (1).pdf

    出栈序列问题,即给出一系列的输入元素顺序,要求判断这些元素以给定规则进栈和出栈操作后可能产生的所有不同的出栈序列。这一问题在数据结构教学中具有重要的地位,因为它不仅考察学生对栈这一数据结构操作的理解,...

    关于数据结构中出栈序列问题的讨论.pdf

    在文章中提到的出栈序列问题,实际上是指对一系列入栈(push)操作之后,按照栈的特性进行出栈(pop)操作,所产生的所有可能的元素排列顺序。对于给定的一系列数字,例如1到n,研究它们可能的所有出栈序列是栈操作...

    cs代码-判断合法出栈序列

    通常,一个合法的出栈序列必须满足以下条件:每次出栈的元素都应当是栈顶的元素,且栈内元素的出栈顺序不能违反它们入栈的顺序。 描述中的“cs代码”表明我们将使用C#编程语言来实现这个功能。C#是一种面向对象的、...

    入栈与出栈操作PPT教案学习.pptx

    例如,当A、B、C依次入栈后,可能的出栈序列包括ABC、ACB、BAC、BCA、CAB和CBA。不可能出现的序列如CBA,因为C是最后入栈的,按照栈的性质,它必须是第一个出栈的。 【栈的数学性质】 对于n个元素的栈,其可能的...

    [公众号蓝蓝考研]2015年计算机408统考真题解析1

    如果前序序列和中序序列分别为`a, b, c, d`,那么出栈序列的个数等于`n+1`,其中`n`是元素个数。这是因为前序序列定义了根节点的入栈顺序,中序序列定义了出栈顺序。 3. **哈夫曼树与权值**:哈夫曼树是一种最优...

    数据结构导论串讲笔记.doc

    题目中提到了已知出栈序列和入栈序列的情况,分析了如何根据出栈序列推导可能的入栈序列,以及反过来推导出栈序列。例如,对于元素A、B、C,只有当输入序列为BCA时,无法通过栈得到输出序列ABC。 2. **队列**: ...

    栈的创建,入栈,出栈

    编写程序任意输入栈长度和栈中的元素值,构造一个顺序栈,对其进行清空、销毁、入栈、出栈以及取栈顶元素操作。将从键盘输入的字符序列逆置输出.比如,从键盘上输入:tset a si sihT;算法将输出:This is a test

    C语言实现栈操作

    假设给定的整数栈 初始状态为空,栈的最大容量为100.从标准输入中输入一组栈操作,按操作顺序输出出栈元素序列。...从标准输入读取一组栈操作,入栈的整数和表示栈操作的整数之间都以一个空格分隔,输出出栈元素序列。

    专题3-简单数据结构1

    这里使用两个数组a和b,a存储待出栈序列,b用于模拟栈。通过循环和条件判断,检查出栈顺序是否合法。 这些题目展示了数据结构在实际问题中的应用,链表用于存储和操作序列数据,队列用于模拟先进先出(FIFO)的行为...

    信息学奥赛:数据结构初步综合测试.docx

    2. **栈的性质**:栈是后进先出(LIFO)的数据结构,所以出栈序列必须保持与入栈顺序相反,除了最后一个元素。例如,如果入栈序列为`ABCDE`,出栈序列不能是`DCBAE`,因为`D`是最后入栈的,应该最后出栈。 3. **栈...

    数据结构 整数计算 C语言 栈操作

    在给定的部分代码中,我们可以看到`calcu()`函数实现了表达式求值的核心逻辑,其中: - `p=s2[t2--];`表示从运算符栈中弹出栈顶运算符; - `x2=s1[t1--];`和`x1=s1[t1--];`分别从操作数栈中弹出后一个和前一个操作数...

Global site tag (gtag.js) - Google Analytics