#include <cctype>
#include <stack>
#include <string>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
  //核心思想先保存数据,后判断是哪种格式的数据
    string solve(string IP) {
        // write code here
        int n=IP.size();
        std::stack<string> stack;
        bool enbleipv4=false;
        bool enbleipv6=false;
        string mystr;
        //将数据存入栈中保存
        for(int i=0;i<n;i++){
            if(IP[i]=='.'){
                if(enbleipv4==false) enbleipv4=true;
                // std::cout<<mystr<<" ";
                stack.push(mystr);
                mystr.clear();
            }else if(IP[i]==':'){
                if(enbleipv6==false) enbleipv6=true;
                if(i==n-1) return "Neither";
                stack.push(mystr);
                mystr.clear();
            }
            else{
                mystr+=IP[i];
                if(i==n-1){
                    stack.push(mystr);
                    // std::cout<<mystr<<" ";
                    mystr.clear();
                }
            }
        }
        if(enbleipv4){
            return isIpv4(stack) ? "IPv4":"Neither";
        }
        else if(enbleipv6){
            return isIpv6(stack) ? "IPv6":"Neither";
        }
        return "Neither";
    }
  //验证数据是否为ipv4
    bool isIpv4(stack<string>& stack){
        int cnt=0;
        while(!stack.empty()){
            string str=stack.top();
            stack.pop();
            try {
                if(str.size()!=1 && str[0]=='0') return false;
                for(auto s: str){
                    if(!isdigit(s))
                    return false;
                }
                int num=std::stoi(str);  // 尝试转换为double
                std::cout<<num<<" ";
                cnt++;//记录ip地址的位数
                if(num>=0&&num<=255)
                {
                    continue;
                }else{
                    return false;
                }
            } catch (...) {
                return false;
            }
        }
        return cnt==4? true:false;
    }
  //验证是否为ipv6
    bool isIpv6(stack<string>& stack){
        int cnt=0;
        while(!stack.empty()){
            string str=stack.top();
            stack.pop();
            cnt++;
            if(str.size()>4 || str.size()==0) 
            return false;
             // 检查剩余字符是否都是十六进制数字
            for(auto s:str) {
                if (!isxdigit(s)) {
                    return false;
                }
            }
        }
        return cnt==8? true:false;
    }
};