问题描述
- 修改了下代码就运行出错了,怎么回事?
-
#include<iostream> using namespace std; struct list { int data; struct list *next; }; class Stack { struct list *ptr; public: Stack() { ptr=NULL; } void push(int x)//进栈成员函数 { struct list *newnode=new struct list; newnode->data=x; newnode->next=ptr; ptr=newnode; } int pop()//出栈成员函数 { //struct list *top; int value; value=ptr->data; //top=ptr; ptr=ptr->next; //delete top; return value; } int empty() { if(ptr==NULL) return 1; else return 0; } }; class Queue { struct list *ptrf,*ptrb; public: Queue() { ptrf=ptrb=NULL; } void enqueue(int x)//进队成员函数 { struct list *newnode=new struct list; newnode->data=x; newnode->next=NULL; if(ptrb==NULL) ptrf=ptrb=newnode; else { ptrb->next=newnode; ptrb=newnode; } } int dequeue()//出队成员函数 { //struct list *tmp; int value; value=ptrf->data; //tmp=ptrf; ptrf=ptrf->next; //delete tmp; return value; } }; void main() { Stack S;//定义一个栈对象 Queue Q;//定义一个队列对象 char ch; int e,p,d; cout<<"输入数据:"; while((ch=getchar())!='.') { S.push(ch); Q.enqueue(ch); } //while(!S.empty()&&S.pop()==Q.dequeue());退栈和出队,比较是否相同 e=S.empty(); while(e==0) { p=S.pop(); d=Q.dequeue(); if(p!=d) break; } if(e==1) cout<<"输入的是回文数据."<<endl; else cout<<"输入的不是回文数据."<<endl; system("pause"); }
解决方案
e=S.empty();
while(e==0) //e始终不变,不就是死循环了吗
{
p=S.pop();
d=Q.dequeue();
if(p!=d)
break;
e=S.empty(); //增加
}
解决方案二:
你注释掉的代码是正确的,因为while条件的!S.empty是每次循环都判断堆栈是否为空了的,而你修改的代码只是第一次循环之前判断了S.empty,while循环体并没有重置判断条件,导致循环的跳出只能在碰到第一个p!=d的时候。
如果没有p!=d的数据,那么循环到S堆栈的边界还要继续的话,就会出现你报错的异常了。
时间: 2024-11-17 17:54:14