关于堆栈的一个问题?

matrix195 2004-09-08 08:51:58
我用链表实现堆栈这个数据结构,具体程序如下:
template<class T>
class LinkedStack;

template<class T>
class Node{
friend LinkedStack<T>;
private:
T data;
Node<T> *next;
};

template<class T>
class LinkedStack{
public:
LinkedStack();
~LinkedStack();
bool IsEmpty() const {return top==0;}
bool IsFull() const;
T Top() const;
LinkedStack<T>& Add(const T& x);
LinkedStack<T>& Delete(T& x);
private:
Node<T> *top;
};

template<class T>
LinkedStack<T>::LinkedStack()
{
top=NULL;
}


template<class T>
LinkedStack<T>::~LinkedStack()
{
Node<T> *pTemp;
while(top){
pTemp=top->next;
delete top;
top=pTemp;
}
}
template<class T>
bool LinkedStack<T>::IsFull() const
{
try {
Node<T> *p=new Node<T>;
delete p;
return false;
}
catch (xalloc) {return true;}
}
template<class T>
T LinkedStack<T>::Top() const
{
// if(IsEmpty()) throw OutOfBounds();
return top->data;
}
template<class T>
LinkedStack<T>& LinkedStack<T>::Add(const T& x)
{
Node<T> *p=new Node<T>;
p->data=x;
p->next=top;
top=p;
return *this;
}
template<class T>
LinkedStack<T>& LinkedStack<T>::Delete(T& x)
{
// if (IsEmpty()) throw OutOfBounds();
x=top->data;
Node<T> *p=top;
top=top->next;
delete p;
return *this;
}
这个程序编译没有错误,但我用它具体实现一个应用的时候,运行就会出现错误
经过调试发现错误出在构造函数上,但不知道怎么改了,也不知道为什么,大下们帮帮我
...全文
220 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodluckyxl 2004-09-09
  • 打赏
  • 举报
回复
是你delete的问题
如果你在第一个元素就插入0的话
// if (IsEmpty()) throw OutOfBounds();被你注释掉了
你取出栈顶的元素
让栈顶指向他的next是个野指针有问题了
goodluckyxl 2004-09-09
  • 打赏
  • 举报
回复
没有什么问题呀
你的栈空的概念是有仅一个0栈中即栈空
delete函数是压入的元素==栈顶元素即取出栈顶元素
不过你到底是压入net[i]中的数还是压入i?
else x->Add(i);
matrix195 2004-09-09
  • 打赏
  • 举报
回复
我实例的是一个匹配问题,一个数组是一个个成对的数,我从数组中读入一个数,先压汝堆栈中,然后读下一个数,如果和栈顶的数相同,就删除栈顶,不相同就把它压入堆栈中,就这样依次进行,最后如果堆栈为空就返回true,否则返回false,函数如下:
bool CheckBox(int net[],int n)
{
LinkedStack<int> *x=new LinkedStack<int>;
x->Add(0);
for (int i=1;i<n;i++)
{
if (net[i]==net[x->Top()])
{
int m;
x->Delete(m);
}
else x->Add(i);
}
if (!x->IsEmpty())
{
cout<<"Switch box is not routable"<<endl;
return false;
}
else
{
cout<<"Switch box is routable"<<endl;
return true;
}
}
绝影 2004-09-09
  • 打赏
  • 举报
回复
我觉得我这个堆栈不错,可以处理从char到__int64的所有数据类型。
/////////////////////////////////////////////////////////
//堆栈类
/////////////////////////////////////////////////////////
class STACK
{
typedef struct SElemType
{
DWORD dwHeight;
DWORD dwLow;
}SElemType;
typedef struct stSTACK
{
SElemType* elem;
stSTACK* next;
}stSTAC;
private:
stSTACK *Top,*Button;
char lpOut[MAX_CHARS];
BOOL _CreateStack();
public:
BOOL bInitSuccess;
STACK(void);
~STACK(void);
BOOL Push(IN LPVOID lpAddress,IN BYTE SizeOfByte);
BOOL Pop(OUT LPVOID lpAddress,IN BYTE SizeOfByte);
};


////////////////////////////////////////////////////////////////
STACK::STACK(void)
{
if(_CreateStack()==FALSE) bInitSuccess=FALSE;
else bInitSuccess=TRUE;
return;
}
STACK::~STACK(void)
{
if(bInitSuccess)
{
//删除堆栈
}
return;
}
////////////////////////////////////////////////////////////////
//构造堆栈
////////////////////////////////////////////////////////////////
BOOL STACK::_CreateStack()
{
Top=(stSTACK*)GlobalAlloc(GPTR,sizeof(stSTACK));
if(Top==NULL)
{
_ShowLogo();
_GetString(IDS_ERRINITSTACK,lpOut,MAX_CHARS);
_ConsolePrint(lpOut);
return FALSE;
}
Top->elem=(SElemType*)GlobalAlloc(GPTR,sizeof(SElemType));
if(Top->elem==NULL)
{
_ShowLogo();
_GetString(IDS_ERRINITSTACK,lpOut,MAX_CHARS);
_ConsolePrint(lpOut);
GlobalFree(Top);
return FALSE;
}
Top->elem->dwHeight=0;
Top->elem->dwLow=0;
Top->next=NULL;
Button=Top;
return TRUE;
}
////////////////////////////////////////////////////////////////
//入栈
////////////////////////////////////////////////////////////////
BOOL STACK::Push(LPVOID lpAddress,BYTE SizeOfBytes)
{
stSTACK* P;
DWORD dwHeight,dwLow;
switch(SizeOfBytes)
{
case 1:
dwHeight=0;
dwLow=*(char*)lpAddress;
break;
case 2:
dwHeight=0;
dwLow=*(short*)lpAddress;
break;
case 4:
dwHeight=0;
dwLow=*(int*)lpAddress;
break;
case 8:
dwLow=*(int*)lpAddress;
dwHeight=*((int*)lpAddress+1);
break;
default:
return FALSE;
}
P=Top;
Top=(stSTACK*)GlobalAlloc(GPTR,sizeof(stSTACK));
if(Top==NULL)
{
_ShowLogo();
_GetString(IDS_ERRALLOCMEM,lpOut,MAX_CHARS);
_ConsolePrint(lpOut);
return FALSE;
}
Top->elem=(SElemType*)GlobalAlloc(GPTR,sizeof(SElemType));
if(Top->elem==NULL)
{
_ShowLogo();
_GetString(IDS_ERRALLOCMEM,lpOut,MAX_CHARS);
_ConsolePrint(lpOut);
GlobalFree(Top);
return FALSE;
}
Top->elem->dwHeight=dwHeight;
Top->elem->dwLow=dwLow;
Button->elem->dwLow++;
Top->next=P;
return TRUE;
}
////////////////////////////////////////////////////////////////
//出栈
////////////////////////////////////////////////////////////////
BOOL STACK::Pop(LPVOID lpAddress,BYTE SizeOfBytes)
{
stSTACK* P;
if(Button->elem->dwLow<=0) return FALSE;
switch(SizeOfBytes)
{
case 1:
*(char*)lpAddress=(char)Top->elem->dwLow;
break;
case 2:
*(short*)lpAddress=(short)Top->elem->dwLow;
break;
case 4:
*(int*)lpAddress=(int)Top->elem->dwLow;
break;
case 8:
*(int*)lpAddress=(int)Top->elem->dwLow;
*((int*)lpAddress+1)=(int)Top->elem->dwHeight;
break;
default:
return FALSE;
}
P=Top->next;
GlobalFree(Top);
Top=P;
Button->elem->dwLow--;
return TRUE;
}

析构函数还没写完.用Stack.Push(Value,sizeof(Value))就可以了。
goodluckyxl 2004-09-09
  • 打赏
  • 举报
回复
没仔细看
Delete 好象也有问题
只能释放第一个接点
中间删除时还要连接上

goodluckyxl 2004-09-09
  • 打赏
  • 举报
回复
幸亏没有结
我看错了不好意思
现在重新改过:
T LinkedStack<T>::Top() const
{
static T returnValue;
memset( &returnValue, 0, sizeof(T) );

if(IsEmpty())
return returnValue; //这里判断一下是否为空
return top->data;
}
template<class T>
LinkedStack<T>& LinkedStack<T>::Delete(T& x)
{
if (IsEmpty())
return *this; //Here
x=top->data;
Node<T> *p=top;
top=top->next;
delete p;
return *this;
}
真的没有仔细看


  • 打赏
  • 举报
回复
应该没什么大问题
积木 2004-09-08
  • 打赏
  • 举报
回复
最好看看你实例化了什么东西
hcj2002 2004-09-08
  • 打赏
  • 举报
回复
构造函数并没有错误,是不是在应用上或其他的问题

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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