九度题目1366——栈的压入弹出序列

栈的压入、弹出序列

时间限制:1 秒

内存限制:32 兆

特殊判题:

题目描述:

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

输入:

每个测试案例包括3行:

第一行为1个整数n(1<=n<=100000),表示序列的长度。

第二行包含n个整数,表示栈的压入顺序。

第三行包含n个整数,表示栈的弹出顺序。

输出:

对应每个测试案例,如果第二个序列是第一个序列的弹出序列输出Yes,否则输出No。

样例输入:
5
1 2 3 4 5
4 5 3 2 1
5
1 2 3 4 5
4 3 5 1 2
样例输出:
Yes
No
方法一:
#include<stdio.h>
#define SIZE 100000
int push[SIZE];
int pop[SIZE];
int stack[SIZE];
int n;
int isPopSqueue(){//返回类型可以使bool型,但是在九度里面以C的方式运行时,如果是bool型会报错,可能原因是那边的C编译器比较老吧。bool类型是在C99里面新增的类型。
        
      int top=-1,i=0,j=0,temp=-1;
      while(j<n){
         if(i<n) stack[++top] = push[i++];
         else temp=j;
         while(top>=0 && stack[top] == pop[j] ){
              j++; top--;
         }
         if( temp == j) return 0;                
     }
     return 1;
}

int main()
{
	while(scanf("%d",&n)!=EOF){
		for(int i=0;i<n;i++)
			scanf("%d",&push[i]);
		for(int i=0;i<n;i++)
			scanf("%d",&pop[i]);
		if(isPopSqueue())
			printf("Yes\n");
		else
			printf("No\n");
	}
	return 0;
}

方法2:(C和C++方式提交都可以)
<pre name="code" class="cpp">#include<stdio.h>
#define SIZE 100000
int push[SIZE];
int pop[SIZE];
int stack[SIZE];
int n;
int isstack(){
	int top = -1, i = 0, j = 0;
	while(i<n){
		if(top>=0&&pop[j] == stack[top]){
			top--;
			j++;
		}
		else if(push[i] == pop[j]){
			i++;
			j++;
		}else{
			stack[++top]=push[i++];
		}
	}
	while(j<n){
		if(top>=0&&pop[j] == stack[top]){
			top--;
			j++;
		}else 
			return 0;
	}
	return 0;

}
int main()
{
	while(scanf("%d",&n)!=EOF){
		for(int i=0;i<n;i++)
			scanf("%d",&push[i]);
		for(int i=0;i<n;i++)
			scanf("%d",&pop[i]);
		if(isstack())
		//if(isPopSqueue())
			printf("Yes\n");
		else
			printf("No\n");
	}
	return 0;
}

方法三:
include<stdio.h>
#define MAXSIZE 100000
int str1[MAXSIZE];
int st[MAXSIZE];
int main()
{
<span style="white-space:pre">	</span>int n;
<span style="white-space:pre">	</span>int top;
<span style="white-space:pre">	</span>while(scanf("%d",&n)!=EOF&&n!=0){
<span style="white-space:pre">		</span>for(int i=0; i< n;i++){
<span style="white-space:pre">			</span>scanf("%d",&str1[i]);
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>top = -1;
<span style="white-space:pre">		</span>int index = 0;
<span style="white-space:pre">		</span>int val;
<span style="white-space:pre">		</span>int k = n;
<span style="white-space:pre">		</span>while(k--){
<span style="white-space:pre">			</span>scanf("%d",&val);
<span style="white-space:pre">			</span>if(top >= 0 && st[top] == val){
<span style="white-space:pre">				</span>top--;
<span style="white-space:pre">			</span>}else{
<span style="white-space:pre">				</span>while(str1[index]!=val&&index<n){
<span style="white-space:pre">					</span>st[++top]= str1[index++];
<span style="white-space:pre">				</span>}
<span style="white-space:pre">				</span>++index;
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>if(top == -1)
<span style="white-space:pre">			</span>printf("Yes\n");
<span style="white-space:pre">		</span>else
<span style="white-space:pre">			</span>printf("No\n");


<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>return 0;
}

bool类型扩展知识:
 
    

首先请大家回想一下,在你们所编写的C程序中,是否使用过bool(布尔)类型?bool类型一般用来表示真假,是程序设计中一个很基本的数据类型。但是,C语言里面并不直接支持bool类型。一些初学C语言,或者是对C语言不是很精通的朋友肯定觉得很奇怪,为什么在C++,JAVA等语言里使用的bool类型,在C语言里无法使用了呢?

问题解析 bool类型的变量,为0时表示为假,为非0时表示为真。但是原始C语言中并不支持bool类型,若需要使用bool类型可以借用int类型自己定义一下,例如:

[cpp] typedef int bool;  #define TRUE 1  #define FALSE 0 

然后就可以在程序中使用bool类型了。用32位的int类型来当bool使用,这样无疑浪费了内存资源,因此对于内存敏感的程序中可以使用char来定义bool类型:

[cpp]  typedef char bool;  #define TRUE 1  #define FALSE 0 

进一步讨论 C语言并非没有bool类型,而是在C99标准之前没有。C99标准中新增的头文件中引入了bool类型,与C++中的bool兼容。该头文件为stdbool.h,其源码如下所示:

[cpp]  #ifndef _STDBOOL_H  #define _STDBOOL_H    #ifndef __cplusplus    #define bool    _Bool  #define true    1  #define false   0    #else /* __cplusplus */    /* Supporting <stdbool.h> in C++ is a GCC extension.  */  #define _Bool   bool  #define bool    bool  #define false   false  #define true    true    #endif /* __cplusplus */    /* Signal that all the definitions are present.  */  #define __bool_true_false_are_defined 1#endif /* stdbool.h */ 

代码中的_Bool是C99标准为bool类型引入的新的关键字,sizeof(_Bool)的值为1,表面其为bool类型。既然为bool类型,那么0表示为假,其他任何值都表示为真,我们可以做一个小实验来测试一下: [cpp]  bool bb=10;  bool aa=0;  printf(" %d %d  \n",bb,aa); 

输出的结果为1和0,这表明bool类型变量赋值为非0值得时候,只存储其值为1。

最后,当需要使用bool类型时,推荐使用C99标准的bool类型而不是自己去定义,引入头文件<stdbool.h>即可,该头文件位于

/usr/lib/gcc/i386-redhat-linux/4.1.1/include/stdbool.h(以我自己的Linux系统为例)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值