为什么手写stack不能过,STLstack能过?(手写stack还有TLE!)
查看原帖
为什么手写stack不能过,STLstack能过?(手写stack还有TLE!)
922691
Hisy楼主2023/8/24 20:29
#include<cstdio>
#include<stack>
#define stacks std::stack
struct node{
	int number=0,identity=0,point=0;
};
void read(int &input){
	input=0;
	int minus=1;
	char got=getchar();
	while('9'<got||got<'0'){
		if(got=='-'){
			minus=-1;
		};
		got=getchar();
	};
	while('0'<=got&&got<='9'){
		input=input*10+got-'0';
		got=getchar();
	};
	input*=minus;
};
void write(const int &output){
	if(output<0){
		putchar('-');
	};
	if(output>9){
		write(output/10);
	};
	putchar(output%10+'0');
};
int main(int argc,char **argv){
	int maxn;
	stacks<node> stack;
	read(maxn);
	node *prev=new node[maxn+1];
	for(int iter=1;iter<=maxn;iter++){
		read(prev[iter].number);
		prev[iter].identity=iter;
		while(stack.size()&&stack.top().number<prev[iter].number){
			prev[stack.top().identity].point=prev[iter].identity;
			stack.pop();
		};
		stack.push(prev[iter]);
	};
	for(int iter=1;iter<=maxn;iter++){
		write(prev[iter].point);
		putchar(' ');
	};
	return 0;
};

这是STL stack,全部AC。

#include<cstdio>
template<typename type>
class stacks{
	private:
		type *prev=new type;
		int size=0;
	public:
		void push(const type &value){
			prev[++size]=value;
		};
		void pop(void){
		    if(size==0){
		        return;
		    };
			--size;
		};
		int length(void){
			return size;
		};
		type top(void){
		    if(size==0){
		        return type();
		    };
			return prev[size];
		};
};
struct node{
	int number=0,identity=0,point=0;
};
void read(int &input){
	input=0;
	int minus=1;
	char got=getchar();
	while('9'<got||got<'0'){
		if(got=='-'){
			minus=-1;
		};
		got=getchar();
	};
	while('0'<=got&&got<='9'){
		input=input*10+got-'0';
		got=getchar();
	};
	input*=minus;
};
void write(const int &output){
	if(output<0){
		putchar('-');
	};
	if(output>9){
		write(output/10);
	};
	putchar(output%10+'0');
};
int main(int argc,char **argv){
	int maxn;
	stacks<node> stack;
	read(maxn);
	node *prev=new node[maxn+1];
	for(int iter=1;iter<=maxn;iter++){
		read(prev[iter].number);
		prev[iter].identity=iter;
		while(stack.length()&&stack.top().number<prev[iter].number){
			prev[stack.top().identity].point=prev[iter].identity;
			stack.pop();
		};
		stack.push(prev[iter]);
	};
	for(int iter=1;iter<=maxn;iter++){
		write(prev[iter].point);
		putchar(' ');
	};
	return 0;
};

这是手写stack,1~3AC,5TLE,其余RE。

2023/8/24 20:29
加载中...