C++链栈的入栈,出栈及其他操作
如果有什么错误,烦请各位大佬指出了,这只是我的学习笔记.
定义栈结点的结构类型
class node{ public: int data; node *next; };
声明栈类,及入栈 和出栈的操作
//栈不需要头节点,直接在top指针操作,所以不需要在构造函数中给top申请地址 //插入操作,直接申请一个结点,将top = s;这样对top操作就是对栈顶的操作 class Stack{ public: node *top; Stack(){ //z利用构造函数将栈指针设置为NULL,否则top指针就成了野指针,因为没有指向一块内存 top = NULL; } void push(int x); //进栈操作 int pop(); //出栈操作 }
1. 进栈操作
//链栈不需要判断栈是否满了,但是可以判断是否申请内存成功,我这里没有判断 void Stack::push(int x){ node *s = new node; s->data = x; s->next = top; //结点的next域指向头指针 top = s; //头指针再指向新结点 }
2. 出栈操作
//出栈是始终从栈顶出栈,所以在入栈的时候使用头插法入栈. //出栈,创建一个临时结点,让临时结点指向头结点,把top->data赋值给x, //让top后移,并删除临时结点,因为临时结点保存的是上一个结点 int pop(){ if(top==NULL){ cout<<"栈空了"<<endl; return; }else{ node *p = top; int x = top->data; top = top->next; delete p; return x; } }
3. 取栈顶元素,不需要移动指针,只需要判断栈是否为空,不为空的时候将栈顶元素返回即可
int gettop(){ if(top==NULL){ cout<<"栈空了"<<endl; return; } else{ return top->data; } }
4. 判断栈空操作
//判断栈空函数,如果栈为空,则返回1,确实是空的,不为空则返回0; int isEmpty(){ if(top==NULL){ return return 1; }else{ return 0; } }
5. 析构函数是用来清空栈的操作
如果栈不为空,则创建一个临时结点指向头结点,让头节点往后移动一个结点,删除p结点,p保存了上一个结点 ~stack(){ while(top != NULL){ node *p = top; top = top->next; delete p; } }