利用c++自带函数以及c手搓实现栈及其简单功能(洛谷B3614)

题目

请你实现一个栈(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'),但是对于这题影响不大;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值