今天学习了java语法中的逻辑控制部分。洛谷题解了一道验证栈序列。
下面总结一下:
java逻辑控制要点
1.大体逻辑上其实和C语言大差不差,就是选择结构,循环结构等等。
2.注意一下switch语句中()内部只能是整型,并且不能是复杂表达式。
3.java的取模操作与C语言有点差别。C语言取模的两个数只能是整型(只能是byte和int)(long也不可以!!!),但是java中取模的两个数可以是浮点型。
4.还有要注意的是,在需要条件判断的语句中,如if(),while(),for()等等,括号内部必须都是布尔表达式。例如:int a=1;while(a){ };这种是不合法的。可以写成while(a==1)这种判断,才能有用。
5.还有要熟练掌握的部分是java中的输入与输出。输出简单,这里提一下输入。
一般需要先写一个类----->> Scanner scanner = new Scanner(System.in)
在类写好之后,我们可以写输入操作:
int a = scanner.nextInt(); (这里注意的就是,如果要输入不同数据类型的数据,那改一下nextInt就好,例如要输入浮点型就是double a = scanner.nextDouble即可)
这样我们就可以进行输入操作了
验证栈序列
这道题也是用到栈解决
解题思路需要总结复习一下:
输入两个序列,一个是入栈序列pushed(这个是自己输入并且确定的),一个是出栈序列poped(这个是自己输入,但需要判断是否正确的)
我们建一个栈stack,一个栈顶指针top这两个基本使用的东西。
我们需要做的是将pushed序列全部入栈,就可以写stack[ ++top ] = pushed[ i ]
然后判断poped序列的值的顺序是否和stack[ top ]从栈顶往下一一对应。
即 stack[ top] ==poped[ head ],由先进栈的后出栈就可以写出这个对应的语句
如果成立,top--,head++,继续找下一个是否对应
这样的话,如果全部符合,top就会指向栈底,那我们就判断top是否在循环结束后指向了栈底,如果成功,就是Yes
以上就是代码的核心逻辑部分。
以下是代码:
#include<stdio.h>
int main() {
int q = 0;
int n = 0;
scanf("%d", &q);
while (q--) {
int top = -1;
int head = 0;
int pushed[100000];
int poped[100000];
int stack[100000];
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &pushed[i]);
}
for (int i = 0; i < n; i++) {
scanf("%d", &poped[i]);
}
for (int i = 0; i < n; i++) {
//入栈
stack[++top] = pushed[i];
//如果入栈序列栈顶元素与对应顺序的出栈序列相同,就将入栈序列的栈顶元素弹出
while (top>-1&&stack[top] == poped[head]) {
top--;
head++;
}
}
if (top == -1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}