#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;
}
};