链式栈的实现:
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战士。