C++ 打破引起段故障

C++ 打破引起段故障,c++,stack,break,C++,Stack,Break,我正在使用堆栈进行括号检查。包含中断的if-else语句之一语句导致段错误 我尝试删除中断程序运行正常,但打印错误的答案,因为需要中断才能打印正确的输出。这种分段故障的原因是什么?中断不能访问任何内存单元,对吗 #包括 #包括 使用名称空间std; int main(){ //代码 int n; char c,comp; cin>>n; 而(n--) { 堆叠; while(cin>>c) { 如果(c=='('| | c=='{'| | c=='[') s、 推(c); 其他的 { comp

我正在使用堆栈进行括号检查。包含中断的if-else语句之一语句导致段错误

我尝试删除中断程序运行正常,但打印错误的答案,因为需要中断才能打印正确的输出。这种分段故障的原因是什么?中断不能访问任何内存单元,对吗

#包括
#包括
使用名称空间std;
int main(){
//代码
int n;
char c,comp;
cin>>n;
而(n--)
{
堆叠;
while(cin>>c)
{
如果(c=='('| | c=='{'| | c=='[')
s、 推(c);
其他的
{
comp=s.top();
如果(c==')和&comp=='('))
s、 pop();
如果(c==')和&comp!='('),则为else
{

cout导致崩溃的原因是,在平衡输入的情况下,循环没有终止。因此,最终将从空堆栈中弹出一些内容

您应该使用do while循环对其进行编码

do
{
    ...
    if (c == ')' && comp != '(')
        break;
    ...
}
while (!s.empty());
if (s.empty())
   cout << "balanced\n";
else
   cout << "not balanced\n";
do
{
...
如果(c==')'&&comp!='(')
打破
...
}
而(!s.empty());
如果(s.empty())

cout导致崩溃的原因是,在平衡输入的情况下,循环没有终止。因此,最终将从空堆栈中弹出一些内容

您应该使用do while循环对其进行编码

do
{
    ...
    if (c == ')' && comp != '(')
        break;
    ...
}
while (!s.empty());
if (s.empty())
   cout << "balanced\n";
else
   cout << "not balanced\n";
do
{
...
如果(c==')'&&comp!='(')
打破
...
}
而(!s.empty());
如果(s.empty())
cout因此,这将在以后变得相关:

契约式编程风格是,具有非空堆栈是调用pop的先决条件,在不满足其先决条件的情况下调用方法会产生未定义的结果

请注意,虽然我找不到一个说当堆栈中有0个元素时,
s.top()
不好的源代码,但出于同样的原因,我假设它也不好

为什么这么重要?好吧,包括segfault。记住这一点

这里的代码是:

comp=s.top();
如果遇到
s
为空的情况,则会发生什么情况?例如,如果在括号末尾设置了一个额外的值(如:

()()) // <-- extra )
您可能还应该围绕
pop()
执行此操作:

if(c==')' && comp=='(' && !s.empty())
           s.pop();
或者类似的东西。你的逻辑可能需要一些修改,但希望这能给你一个想法。

因此,这将在以后变得相关:

契约式编程风格是,具有非空堆栈是调用pop的先决条件,在不满足其先决条件的情况下调用方法会产生未定义的结果

请注意,虽然我找不到一个说当堆栈中有0个元素时,
s.top()
不好的源代码,但出于同样的原因,我假设它也不好

为什么这么重要?好吧,包括segfault。记住这一点

这里的代码是:

comp=s.top();
如果遇到
s
为空的情况,则会发生什么情况?例如,如果在括号末尾设置了一个额外的值(如:

()()) // <-- extra )
您可能还应该围绕
pop()
执行此操作:

if(c==')' && comp=='(' && !s.empty())
           s.pop();

或者类似的东西。你的逻辑可能需要一些修改,但希望这能给你一个想法。

你能发布导致seg错误的输入字符串吗?另外,如果第一个元素是平衡的,你不需要弹出第一个元素吗?@ArikRinberg感谢你提醒我编辑的代码仍然是段错误。@Harshalma Your
if(s.empty())
语句位于错误的位置(它应该在while循环之外)。请确保您发布了正确的代码,如果我认为我使用了错误的代码,我没有信心进行此操作。顺便说一句。您的比较可以做得更优雅一点:
if(c=='){if(comp==')(')s.pop()<代码> >包含< <代码> >包括C++标准库中的所有东西,使 >包含< /代码>无意义。换句话说,与很多物品邪教一样,你能发布导致SEG错误的输入字符串吗?也不需要弹出第一个元素i吗?f是否平衡?@ArikRinberg感谢您提醒我编辑了代码仍然是段错误。@HarshalSharma如果(s.empty())
语句位于错误的位置(它应该在while循环之外)。请确保您发布了正确的代码,如果我认为我使用了错误的代码,我没有信心处理此代码。顺便说一句。您的比较可以做得更优雅一些:
if(c==')){if(comp==')(')s.pop()<代码> >包含< <代码> >包括C++标准库中的所有东西,使包含“< /代码>无意义”。{stacks;string ss;cin>>ss;for(int i=0;iI)尝试了这个方法,但仍然给出了段错误。但是通过了一些测试用例。`while(n--){stacks;string ss;cin>>ss;for(int i=0;i)