Track， 2019-05-26 23:15 采纳率: 100%

# 用栈来实现回文数的时候测试数字13时出现异常（其余好像没问题）

**感谢您来帮忙。。。
**

``````#include<iostream>
using namespace std;
struct Node
{
int data;
Node()
{
data = 0;
}
Node(int d)
{
data = d;
}
};
{
private:
Node* first;  //头结点存储输入判断的数据，其余结点存储权位的值
Node* Locate(int i);  //定位，返回地址，仅仅是给公有成员用
public:
int Lenth();  //计算长度
int GetNum() { return first->data; }
void Push(int num);  //压栈
void Clear();  //清空栈
int Pop();  //弹出
};

{
first = new Node;
}
{
first = new Node(num);
}

{
Node* current = first;
int count = 0;
{
count++;
}
return count;
}

{
int count = 0;
Node* current = first;
for (count; count < i; count++)
{
}
return current;
}

{
int x = this->Lenth();
Node* current = this->Locate(x);
Node* newnode = new Node(num);
if (newnode == NULL)
{
cerr << "error !" << endl;
exit(1);
}
}

{
int len = this->Lenth();
for (int i = 0; i < len; i++)
{
this->Pop();
}
}
{
int x = this->Lenth() - 1;  //定位到栈顶前一个
Node* current = this->Locate(x);
return value;
}
{
int num = a.GetNum();
int x;  //记录余数
do   //由于进制转换的时候要反序，所以考虑压栈
{
x = num % m;
num = num / m;
a.Push(x);  //进制压栈
} while (num / m);
a.Push(num);
}

{
int x = a.Lenth() % 2;  //需要判断长度的奇偶
for (int i = 0; i < a.Lenth()/2; i++)
{
b.Push(a.Pop());  //将转换为进制的一半压到b栈,并且弹出a栈的一半
}
if (x==1)  //为奇数
{
int y = a.Pop();  //去掉a栈里面原来中间的元素(现在栈顶的元素)
}
for (int i = 0; i <= a.Lenth(); i++)
{
int x = a.Pop();
int y = b.Pop();
if (x!=y) return false;  //判断回文
}
return true;
}

int main()
{
while (1)
{
int num;  //判断的数据
int count = 0;  //用于计数
int x[50];  //用于记录是回文数的进制
cin >> num;
if (num == 0) break;
for (int i = 2; i < 17; i++)  //判断各种进制的可能，并将是回文数的进制记入数组
{
if (judge(a))
{
x[count] = i;
count++;
}
a.Clear();
}
if (count == 0)
{
cout << "Number " << a.GetNum() << " is not a palindrom" << endl;
}
else
{
cout << "Number " << a.GetNum() << " is palindrom in basis ";
for (int i = 0; i < count; i++)
{
cout << x[i] << ' ';
}
cout << endl;
}
}
return 0;
}
``````
• 写回答

#### 1条回答默认 最新

• wallesyoyo 2019-05-27 09:41
关注

在你的judge函数里面，有两个循环体。

``````for (int i = 0; i < a.Lenth()/2; i++)
{
b.Push(a.Pop());  //将转换为进制的一半压到b栈,并且弹出a栈的一半
}
``````
``````for (int i = 0; i <= a.Lenth(); i++)
{
int x = a.Pop();
int y = b.Pop();
if (x!=y) return false;  //判断回文
}
``````

每个循环体内都在从a里面往外pop元素，导致a的长度一直在变，而你循环体的判断条件内a.length()又每次都在重新计算length，导致异常。

解决方法，把a.length()存到一个变量里面。

本回答被题主选为最佳回答 , 对您是否有帮助呢?
评论

#### 悬赏问题

• ¥15 ros的rviz仿真机器人
• ¥15 关于#linux#的问题（输入输出错误）：出现这个界面接着我重新装系统，又让修电脑的师傅帮我扫描硬盘（没有问题）用着用着又卡死（相关搜索：固态硬盘）
• ¥15 cv::resize不同线程时间不同
• ¥15 web课程，怎么做啊😭没好好听课 根本不知道怎么下手
• ¥15 做一个关于单片机的比较难的代码，然后搞一个PPT进行解释
• ¥15 python提取.csv文件中的链接会经常出现爬取失败
• ¥15 数据结构中的数组地址问题
• ¥15 maya的mel里，怎样先选择模型A，然后利用mel脚本自动选择有相同名字的模型B呢。
• ¥15 Python题，根本不会啊
• ¥15 会会信号与系统和python的来