C++栈和典型迷宫问题( 三 )

3.3 入栈、出栈链表的数据插入方案有头部插入和尾部插入两种方案 。在模拟栈时须保证数据的维护只能在一端进行,可以有 2 种方案:

  • 数据的插入和删除在头部进行 。
  • 数据的插入和删除在尾部进行 。
本文以头部插入实现入栈和出栈算法 。
3.3.1 入栈链式栈不需要考虑栈是已经满的问题 。入栈实现流程:
  • 创建一个新结点对象 。
  • 原来的头结点成为新结点的后驱结点 。
  • 新结点成为头结点 。
//入栈bool push(T data) {    //创建新结点    Node<T> *newNode=new Node<T>(data);    if(newNode){        //原来的头结点成为新结点的后驱        newNode->next=this->head;        //新结点成为头结点        this->head=newNode;        this->size++;        return 1;    }else{        return 0;    }}3.3.2 出栈链式栈的出栈操作需要判断栈是否为空 。如果不为空刚取出头结点数据,并把结点从链表中删除 。实现流程:
//出栈T pop() {    Node<T> * node=NULL;    T data;    if(this->head){        //获取头结点        node=this->head;        //得到数据        data=https://www.huyubaike.com/biancheng/node->data; //原来头结点的后驱成为新头结点 this->head=this->head->next; //删除结点 delete node; this->size--; return data; }else{ //链表为空 return NULL; }}为了方便查询栈顶数据,需要提供一个查询栈顶数据的操作 。
//查看栈顶数据T getTop() {    if(this->head) {        return this->head->data;    } else {        return NULL;    }}3.3.3 测试链式栈int main(int argc, char** argv) { Stack<int> stack ; //入栈 for(int i=0; i<10; i++) {stack.push(i); } cout<<"栈中实际数据大小:"<<stack.getSize()<<endl; cout<<"查询栈顶数据:"<<stack.getTop()<<endl; //出栈 for(int i=0; i<10; i++) {cout<<stack.pop()<<endl; } return 0;}执行结果:
C++栈和典型迷宫问题

文章插图
4. STL 中的栈实际应用时,可以使用STL的stack容器 。除了上述的基本操作外,stack容器还提供比较操作,这些操作可以被用于栈与栈之间的比较, 相等指栈有相同的元素并有着相同的顺序 。
#include <iostream>#include <stack>using namespace std;int main(int argc, char** argv) { stack<int> myStack; //入栈 for(int i=0;i<5;i++){myStack.push(i); } cout<<"栈中数据大小:"<<myStack.size()<<endl; //出栈 for(int i=0;i<4;i++) {cout<<"栈顶数据:"<<myStack.top()<<endl;myStack.pop(); } cout<<"栈顶数据:"<<myStack.top()<<endl; stack<int> myStack_; myStack_.push(0); bool res= myStack_==myStack; cout<<"比较结果:"<<res<<endl; return 0;}

经验总结扩展阅读