链式栈的简单实现

链式栈的实现:
1、栈的特点栈顶插入元素和删除元素。
2、链式栈的结点:也是一个数据域和一个链接域。
3、栈采用类来实现:
1)需要设定一个一个栈顶指针 top,指向第一个元素
2)本数据结构需要实现三个重要的方法:
入栈,出栈,输出栈内元素三个方法

栈的结点仍然包含一个数据域和一个链接域:

struct StackNode
{
	int data;
	StackNode *link;
};

 栈的抽象数据类型使用类来表示,重要的方法有入栈、出栈和输出栈中内容三个:

class Stack{
protected:
	StackNode *top;	//先声明一个栈顶指针
public:
	Stack()			//构造函数
	{
		top=new StackNode;	//用默认值初始化这个栈顶指针
		StackNode *p=top;
		p->link=NULL;		//思维点1:需要在这里先将最后一个位置初始化为NULL

	}	
	~Stack();	//析构函数

	//入栈、出栈和输出栈内元素三个方法
	void PushStack(int data);	//入栈
	void PopStack();			//出栈
	void OutputStack();			//输出栈内元素
};

 下面着重对三个算法进行阐述:

入栈算法:
1、新建这个top指针,用默认的初始化值,然后把data赋值给它

void Stack::PushStack(int data)
{
	
	StackNode *newNode=new StackNode;	//声明一个新结点,用于进行链接
	if(newNode==NULL){cout<<"分配错误!"<<endl;}	//这句验证的话很重要
	
	top->data=data;		//将该值赋值给该指针的数据域
	
	//top->link=newNode;	//栈顶指针指向下一个位置 
	//top=newNode;			//这两句有问题??

	newNode->link=top;
	//top->link=NULL;			//将栈低的link域设置为空,否则会出现野指针错误
	top=newNode;		

}

 输出栈内元素的算法:
1、由于栈顶指针指向的位置的数据域并未赋值,则需输出top->link处的值。

void Stack::OutputStack()
{
	top=top->link;
	while(top!=NULL)
	{
		cout<<top->data<<" ";
		top=top->link;
	}
	cout<<endl;
	
}

 出栈算法:
1、栈顶指针下移,返回出栈的元素,用临时指针接受这个值。
2、删除临时指针指向的单元。

void Stack::PopStack()
{
	StackNode *p=top;
	top=top->link;
	delete p;
}

 

总结:

1、出现错误最多的是指针的指向问题:在编程中应该时刻跟踪指针的指向,并且多使用空指针判断语句和异常处理

2、使用异常处理和调试可以节省调试程序的时间。

3、丢掉书本,开始尝试自己去构建程序,而不是一直做CV战士。

posted @ 2013-04-01 11:01  李VS超  阅读(406)  评论(0编辑  收藏  举报