8、Pop Sequence(简单方法)

这道题一次就全AC,太爽辣
(编译错误可能是因为不能提前声名函数,把后面的函数全放前面就可以)
在这里插入图片描述

题目

在这里插入图片描述
在这里插入图片描述
题目意思很好理解,大体就是判断一个先入后出的堆栈,能不能得到以下的输出结果。
第一行有三个数据:
栈的大小 判断数据的数量 判断几次
之后每行就输入你要判断的输出的数据。
例如1,2,3顺序入栈,你能控制输入输出的时间,得到123,321,213等数据,得不到312。

代码分析

简单分为3个部分,输入,判断,输出。
我们每输入完一次数据,就进行一次判断,得出结果并输出。
主函数

#include<stdio.h>
#include<stdlib.h>
#define MAX 1000
typedef struct SNode* Stack;
struct SNode
{
	int Data[MAX];
	int Top;
};
int Judge(int *a, int n, int time);
int Push(int i, int max, Stack Ptrl);
int Pop(Stack Ptrl);
int main()
{
    //表示栈的大小,数据总数,判断次数
	int max, n, time;
	int i, j, flag;
	int a[MAX];//存储输入数据
	scanf("%d %d %d", &max, &n, &time);
	for (i = 0; i < time; i++)
	{
		for (j = 0; j < n; j++)
		{
			scanf("%d", &a[i]);
		}
		flag = Judge(a, max, n, time);//判断函数
		if (flag == 1)
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}

入栈、出栈函数
学了堆栈的应该都懂,就不细讲了。

//入栈
int Push(int i, int max, Stack Ptrl)//i是入栈的数据,max是堆栈大小
{
	if (Ptrl->Top + 1 != max)//判断栈是否存满
	{
		Ptrl->Data[++(Ptrl->Top)] = i;
		return 1;
	}
	else//如果栈满了
		return 0;
}
//出栈
int Pop(Stack Ptrl)
{
	return Ptrl->Data[Ptrl->Top--];
}

判断函数
第一步我们把数字1入栈。

之后进入循环,如果遍历了一遍输入的数据a[ j ],就停止循环,因为遍历中每一个数都得到实现,说明能得到这样的结果,所以return 1.

循环中有3种情况。
1、a[ j ] = 刚入栈的数
让这个数出栈,之后j++,a[ j ]挪到下一位。
2、a[ j ] > 刚入栈的数
说明还没到输出机会,再入栈一个数
3、a[ j ] < 刚入栈的数
说明无法出栈,此时这个出栈方法就不能实现,直接return 0.

int Judge(int* a, int max, int n, int time)
{
	int flag;
	int j = 0, i = 1, t;//i表示入栈的数
	Stack Ptrl = (Stack)malloc(sizeof(struct SNode));
	Ptrl->Top = 0;//把1入栈
	Ptrl->Data[Ptrl->Top] = i;
	i++;
	while (j != n)
	{
		if (a[j] > Ptrl->Data[Ptrl->Top])//大于情况
		{
			flag = Push(i, max, Ptrl);
			if (flag == 0)//栈满了,说明该方法不成立
				return 0;
			i++;
		}
		else if (a[j] == Ptrl->Data[Ptrl->Top])//等于情况
		{
			t = Pop(Ptrl);
			j++;
		}
		else//小于情况
		{
			return 0;
		}
	}
	free(Ptrl);
	return 1;
}

代码实现

#include<stdio.h>
#include<stdlib.h>
#define MAX 1000
typedef struct SNode* Stack;
struct SNode
{
	int Data[MAX];
	int Top;
};
int Judge(int *a, int n, int time);
int Push(int i, int max, Stack Ptrl);
int Pop(Stack Ptrl);
int main()
{
	int max, n, time;
	int i, j, flag;
	int a[MAX];
	scanf("%d %d %d", &max, &n, &time);
	for (i = 0; i < time; i++)
	{
		for (j = 0; j < n; j++)
		{
			scanf("%d", &a[j]);
		}
		flag = Judge(a, max, n, time);
		if (flag == 1)
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}
int Push(int i, int max, Stack Ptrl)
{
	if (Ptrl->Top + 1 != max)
	{
		Ptrl->Data[++(Ptrl->Top)] = i;
		return 1;
	}
	else
		return 0;
}
int Pop(Stack Ptrl)
{
	return Ptrl->Data[Ptrl->Top--];
}
int Judge(int* a, int max, int n, int time)
{
	int flag;
	int j = 0, i = 1, t;//i表示入栈的数
	Stack Ptrl = (Stack)malloc(sizeof(struct SNode));
	Ptrl->Top = 0;//把1入栈
	Ptrl->Data[Ptrl->Top] = i;
	i++;
	while (j != n)
	{
		if (a[j] > Ptrl->Data[Ptrl->Top])
		{
			flag = Push(i, max, Ptrl);
			if (flag == 0)//栈满了,说明该方法不成立
				return 0;
			i++;
		}
		else if (a[j] == Ptrl->Data[Ptrl->Top])
		{
			t = Pop(Ptrl);
			j++;
		}
		else
		{
			return 0;
		}
	}
	free(Ptrl);
	return 1;
}

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、用自定义模块建立一个Python程序文件。 2、创建一个fibo、py模块,其中包含两个求Fibonacci数列的函数,然后导入该模块并调用其中的函数。 3、例8-10,先定义函数求∑_(i=1)^n▒i^m ,然后调用该函数求s=∑_(k=1)^100▒k+∑_(k=1)^50▒k^2 +∑_(k=1)^10▒1/k。 4、输出宠物的叫声。 5、定义一个函数,实现两个数的四则运算,要注意有3个参数,分别是运算符和两个用于运算的数字。 6、假设设一个简单的ATM机的取款过程是这样的:首先提示用户输入密码(pakaword),最多只能输入3次,超过3次见提示用户"密码错误,请取卡”结束交易。如果用户密码码正确,再提示用户输入金额(amount). ATM机只能输出100元的纸币,一次取钱数要求最低0元,最高1000元。如果用户输入的金额符合上述要求。则打印出用户取的钱数。最后提示用户“交易完成,请取卡”,否则提示用户重新输入金额。假设用户密码是“888888”。 7、编写一个函数,输入n为偶数时 ,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数 1/1+1/3+...+1/n。 8、斐波那契数列(Fibonacci sequence)指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)。 9、约瑟夫环问题:n个人组成一个环或者排成一个队,从n个人的第一个人每次报数k,然后剔除。 10、输出裴波那契数列。 11、什么叫递归函数?举例说明。 12、什么叫lambda函数?举例说明。
06-07
好的,我已经记录了您的问题。让我来依次回答: 1、可以使用以下代码创建一个 Python 程序文件: ``` # -*- coding: utf-8 -*- def main(): print("Hello World!") if __name__ == '__main__': main() ``` 将上述代码保存为 `hello.py` 文件,然后在终端中运行 `python hello.py` 命令即可输出 "Hello World!"。 2、可以使用以下代码创建 `fibo.py` 模块: ``` # -*- coding: utf-8 -*- def fib(n): a, b = 0, 1 while b < n: print(b, end=' ') a, b = b, a+b print() def fib2(n): result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a+b return result ``` 然后在需要调用该模块的 Python 程序中,使用以下代码导入并调用其中的函数: ``` import fibo fibo.fib(100) print(fibo.fib2(100)) ``` 3、可以使用以下代码定义一个求和函数和计算表达式的代码: ``` # -*- coding: utf-8 -*- def sum_of_power(n, m): return sum([i**m for i in range(1, n+1)]) s = sum_of_power(100, 1) + sum_of_power(50, 2) + sum([1/i for i in range(1, 11)]) print(s) ``` 4、输出宠物的叫声可以使用以下代码: ``` # -*- coding: utf-8 -*- class Pet: def __init__(self, name): self.name = name def make_sound(self): pass class Dog(Pet): def make_sound(self): print(f"{self.name} barks") class Cat(Pet): def make_sound(self): print(f"{self.name} meows") dog = Dog("Rufus") cat = Cat("Whiskers") dog.make_sound() cat.make_sound() ``` 5、定义一个实现两个数的四则运算的函数可以使用以下代码: ``` # -*- coding: utf-8 -*- def calculate(operator, num1, num2): if operator == '+': return num1 + num2 elif operator == '-': return num1 - num2 elif operator == '*': return num1 * num2 elif operator == '/': return num1 / num2 else: return None result = calculate('+', 3, 5) print(result) ``` 6、实现简单的 ATM 取款过程可以使用以下代码: ``` # -*- coding: utf-8 -*- password = "888888" remaining_attempts = 3 while remaining_attempts > 0: input_password = input("请输入密码:") if input_password != password: remaining_attempts -= 1 if remaining_attempts == 0: print("密码错误,请取卡") break else: print(f"密码错误,还剩 {remaining_attempts} 次机会,请重新输入") continue else: input_amount = int(input("请输入取款金额:")) if input_amount < 0 or input_amount > 1000 or input_amount % 100 != 0: print("输入金额错误,请重新输入") continue else: print(f"取款 {input_amount} 元成功,请取卡") break ``` 7、实现求和函数并根据奇偶性调用不同的求和方式可以使用以下代码: ``` # -*- coding: utf-8 -*- def sum_of_even(n): return sum([1/i for i in range(2, n+1, 2)]) def sum_of_odd(n): return sum([1/i for i in range(1, n+1, 2)]) n = int(input("请输入一个整数:")) if n % 2 == 0: s = sum_of_even(n) else: s = sum_of_odd(n) print(s) ``` 8、实现斐波那契数列可以使用以下代码: ``` # -*- coding: utf-8 -*- def fibonacci(n): if n == 0: return 0 elif n == 1: return 1 else: return fibonacci(n-1) + fibonacci(n-2) for i in range(10): print(fibonacci(i)) ``` 9、实现约瑟夫环问题可以使用以下代码: ``` # -*- coding: utf-8 -*- def josephus(n, k): people = list(range(1, n+1)) count = 0 while len(people) > 1: count += k - 1 if count >= len(people): count %= len(people) people.pop(count) return people[0] n = 10 k = 3 print(josephus(n, k)) ``` 10、输出裴波那契数列可以使用以下代码: ``` # -*- coding: utf-8 -*- a, b = 0, 1 while b < 1000: print(b, end=' ') a, b = b, a+b ``` 11、递归函数指的是在函数内部调用自身的函数。例如,以下代码实现了一个递归函数来计算阶乘: ``` # -*- coding: utf-8 -*- def factorial(n): if n == 1: return 1 else: return n * factorial(n-1) print(factorial(5)) ``` 12、lambda 函数是一种匿名函数,可以使用简单的语法定义,例如: ``` # -*- coding: utf-8 -*- f = lambda x, y: x + y print(f(3, 5)) ``` 以上就是您提出的所有问题的回答,希望能够帮助您。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值