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