题目
请你实现一个栈(stack),支持如下操作:
push(x)
:向栈中加入一个数 x。pop()
:将栈顶弹出。如果此时栈为空则不进行弹出操作,输出Empty
。query()
:输出栈顶元素,如果此时栈为空则输出Anguei!
。size()
:输出此时栈内元素个数。
解答:
c++自带的函数引用,在题中都有涉及,top也会默认是栈顶第一个元素;
另外提一嘴string函数:
可以直接将字符串输入进string中,而不用再另外设计数组来存储字符串与题目所给字符串比对,c++是不能直接x==y判断字符串的,c也一样;但是string可以直接判断;
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main()
{
stack<int>s;
int t,n,i;
cin>>t;
string a;
while(t--)
{
cin>>n;
while(n--)
{
cin>>a;
if(a=="push")
{
cin>>i;
s.push(i);
}
else if(a=="pop")
{
if(s.empty())
cout<<"Empty"<<endl;
else{
s.pop();
}
}
else if(a=="query")
{
if(s.empty())
cout<<"Anguei!"<<endl;
else
cout<<s.top()<<endl;
}
else
cout<<s.size()<<endl;
}
}
}
接下来是c手搓栈:
#include<stdio.h>
#include<stdlib.h>
unsigned long long a[1000005];
int main(){
char str[10];
unsigned long long x,T,n;
scanf("%llu",&T);
while(T--)
{
int top=0;
scanf("%llu",&n);
while(n--)
{
scanf("%s",str);
if (str[0]=='p') {
if(str[1]=='u'){
scanf("%llu", &x);
a[++top] = x;
}
else {
if (top == 0)
printf("Empty\n");
else {
top--;
}
}
}
else if (str[0]=='q') {
if (top == 0) printf("Anguei!\n");
else printf("%llu\n", a[top]);
} else if (str[0]=='s') {
printf("%d\n", top);
}
}
}
return 0;
}
1 首先最重要的,关于栈的内存分配,使用unsigned long long类型,可以存的大数据,其次此定义务必放在main函数外作为全局声明,若放在main或其他函数中作为局部声明会导致内存溢出,导致程序运行崩溃(表示就是这个“特性”导致本码喽多花了1个小时反复研究【崩溃.jpg】)
2 值得注意的是,关于top=0的初定义,务必放在第一次关于T的循环层,不要贪图方便把什么变量都放在函数开头一起来定义(这又是另一个悲伤的故事了)
3 其次可以尝试使用Switch函数来进行判定, case读取数组的第一个来判断;
switch(str[0])
{
case 'p':if(str[1]=='u')
{
scanf("%llu",&x);
a[++top]=x;}
else
{
if(top==0)
{
printf("Empty\n") ;
}
else{
top--;
}
}
break;
case 'q':if(top==0)
{
printf("Anguei!\n");
}else
{
printf("%llu\n",a[top]);
}
break;
case 's':printf("%d\n",top);
break;
}
但是使用Switch本码喽过不了,不知道有没有懂行的大佬指正一下(膜拜)
4 原代码中if的 条件可以合并(str[0]=='p'&&tr[1]=='u'),但是对于这题影响不大;