大家看我哪错了啊

MichaleLeo 2011-10-18 11:08:19
#ifndef STACK_H_
#define STACK_H_

#include<stdio.h>
struct StackNode
{
int data;
StackNode *next;
};
class Stack
{
private:
StackNode *top,*p,*q;
public:
Stack(){top=new StackNode;p=q=NULL;}
~Stack(){clear();delete top;}
void push(int e);
int pop();
bool getTop(int &e);
void clear();
bool isEmpty(){return top==NULL;}
};
#endif

#include"stack.h"
#include<iostream>
void Stack::push(int e)
{
p=new StackNode;
p->data =e;
p->next =top->next ;
top->next =p;


}

int Stack::pop()
{
if(isEmpty())
return 0;
int e;
q=new StackNode;
q=top->next;
e=q->data ;
top->next =q->next;
delete q;
return e;
}
bool Stack::getTop(int &e)//此处不能为const int &e,否则不能将top->next->data赋给常量
{
if(isEmpty())
return false;
e=top->next ->data;
return true;
}

void Stack::clear()
{
StackNode *p=top->next;

while(top->next !=NULL)
{
top->next =p->next ;
delete p;
p=top->next;
}

}

#include"stack.h"
#include<iostream>
using namespace std;
#define UP -1
#define DOWN 1
#define RIGHT 1
#define LEFT -1
int a[7][7];

void initMaze();
int getnum(int i,int j);
int main()
{
Stack s;
int x,y,z,flat;
initMaze();
int i=1;
int j=1;
s.push(getnum(i,j));

while(a[i][j]!=2) //当没到出口a[5][5]时进行循环操作
{
if(a[i][j+RIGHT]==0)
{
s.push (getnum(i,j+RIGHT));
a[i][j+RIGHT]=1; 走过的路被设置为1,以防重复走已经走过得路,退出用pop()
j=j+1;


}
else
if(a[i+UP][j]==0)
{
s.push (getnum(i+UP,j));
a[i+UP][j]=1;
i=i-1;


}
else
if(a[i+DOWN][j]==0)
{
s.push (getnum(i+DOWN,j));
a[i+DOWN][j]=1;
i=i+1;


}
else
if(a[i][j+LEFT]==0)
{
s.push (getnum(i,j+LEFT));
a[i][j+LEFT]=1;
j=j-1;



}
else
{
flat=s.pop (); //不通时出栈
flat=s.pop (); //再出栈一次
i=flat/10; //获得下标
j=flat%10;
s.push (getnum(i,j)); //入栈
}



}


cout<<"出迷宫的路线是: "<<endl;
while(!s.isEmpty ())
{
x=s.pop();
y=x/10;
z=x%10;
cout<<"("<<y<<" , "<<z<<")"<<"<--";
}

cin.get();
return 0;
}

void initMaze()
{
int i,j;
for(i=0;i<7;i++)
for(j=0;j<7;j++)
a[i][j]=0;
for(i=0;i<7;i++)
a[i][0]=a[i][6]=1;
for(j=0;j<7;j++)
a[0][j]=a[6][j]=1;
a[1][2]=a[2][4]=a[1][4]=a[3][1]=a[4][3]=a[4][5]=a[5][2]=1; //墙壁标志为1
for(i=0;i<7;i++)
{
for(j=0;j<7;j++)
if(a[i][j]==1)
cout<<" * ";
else
cout<<" O ";
cout<<endl;
}
a[5][5]=2; // 出口
a[1][1]=1; //入口
}






int getnum(int i,int j) //将数组下标转为十进制
{
int c=i*10+j;
return c;
}
//测试部分
/* s.push(1);
s.push (2);
s.push(3);
cout<<s.pop();
cout<<s.pop ();
cout<<s.pop ();
cin.get();
return 0;
}*/

大家看我哪里错了啊,测试部分可以用地
...全文
56 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
追求执着 2011-10-19
  • 打赏
  • 举报
回复
bool isEmpty(){return top==NULL;}
这个显然错了!
lijinlin_love 2011-10-19
  • 打赏
  • 举报
回复
楼主的 isEmpty() 逻辑明显不对

top = new StackNode;

top 怎么会==NULL呢

写完一个模块的代码要好好测试 多测试各种情况 等都通过再用。
atnostyle 2011-10-19
  • 打赏
  • 举报
回复
这么长,是不会有人看的
MichaleLeo 2011-10-18
  • 打赏
  • 举报
回复
我已经调试了半天了,感觉思路没错啊。。。囧
sxqinge 2011-10-18
  • 打赏
  • 举报
回复
自己编译、调试看看么

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧