题目:AB1 【模板】栈✨
描述✨
请你实现一个栈。
操作:
push x:将 加x\x 入栈,保证 x\x 为 int 型整数。
pop:输出栈顶,并让栈顶出栈
top:输出栈顶,栈顶不出栈
输入描述✨:
第一行为一个正整数 n\n ,代表操作次数。(1 \leq n \leq 100000)(1≤n≤100000)
接下来的 n\n ,每行为一个字符串,代表一个操作。保证操作是题目描述中三种中的一种。
输出描述✨:
如果操作为push,则不输出任何东西。
如果为另外两种,若栈为空,则输出 "error“
否则按对应操作输出。
示例1✨
输入:
6
push 1
pop
top
push 2
push 3
pop
复制
输出:
1
error
3
题解代码✨:
#include<stdlib.h> #include<string.h> #define MAX 100000 typedef struct Stack{ int a[MAX]; int topp; }*LStack; void inistack(LStack s){ s->topp=0; } void push(LStack s,int x){ s->a[s->topp]=x; s->topp++; } int pop(LStack s){ if(s->topp==0){ return -1; } return s->a[--s->topp]; } int top(LStack s){ if(s->topp==0){ return -1; } int num=s->a[--s->topp]; s->topp++; return num; } int main(){ LStack s=(LStack)malloc(sizeof(struct Stack)); inistack(s); int n=0; scanf("%d",&n); while(n--){ char *str=(char*)malloc(6*sizeof(char)); scanf("%s",str); if(!strcmp(str,"push")){ int num=0; scanf("%d",&num); push(s,num); } if(!strcmp(str,"pop")){ int num1=pop(s); if(num1==-1){ printf("error\n"); continue; } printf("%d\n",num1); } if(!strcmp(str,"top")){ int num2=top(s); if(num2==-1){ printf("error\n"); continue; } printf("%d\n",num2); } } return 0; }
题目:NC65 斐波那契数列🎉
描述🎉
大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。
斐波那契数列是一个满足 fib(x)=\left{
1x=1,2 fib(x−1)+fib(x−2)x>2
1x=1,2 fib(x−1)+fib(x−2)x>2
\right.fib(x)={
1
fib(x−1)+fib(x−2)
x=1,2
x>2
的数列
数据范围:1\leq n\leq 401≤n≤40
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n) ,本题也有时间复杂度 O(logn)O(logn) 的解法
输入描述🎉:
一个正整数n
返回值描述🎉:
输出一个正整数。
示例🎉:
输入:4
返回值:3
说明:
根据斐波那契数列的定义可知,fib(1)=1,fib(2)=1,fib(3)=fib(3-1)+fib(3-2)=2,fib(4)=fib(4-1)+fib(4-2)=3,所以答案为3。
示例2
输入:1
返回值:1
示例3
输入:2
返回值:1
解题代码🎉:
/** * * @param n int整型 * @return int整型 * * C语言声明定义全局变量请加上static,防止重复定义 */ int Fibonacci(int n ) { // write code here int a[50]; a[1]=1,a[2]=1; for(int i=3;i<n+1;i++) { a[i]=a[i-1]+a[i-2];//这里一定要避免出现a[-1]等的情况 } return a[n]; }