链式栈
优点
链栈的建立是基于链表而不是数组。基于链表的栈相对于基于数组的栈提供了两个优点:
- 不需要指定栈的起始大小。链栈只需要从一个空的链表开始,然后每次压入一个值时即扩展一个结点;
- 要系统具有足够的可用内存,链栈将永远不会满。
指针注意事项
链式栈的结构体定义如下:
1 typedef struct NODE 2 { 3 int data; 4 struct NODE *link; 5 }node, *pnode;
其中数据类型是node,pnode是指针类型即:指向node变量地址的针,也是存储node变量的地址的空间。
操作数据的时候要将指针解引用 *p(看进栈代码) 或者使用 ->(看出栈代码)来操作数据。
代码实现
#include <iostream> using namespace std; typedef struct NODE { int data; struct NODE *link; }node, *pnode; pnode creatStack()//创建一个空栈 { pnode top = new node; if(top == NULL) { cout << "栈建立失败" << endl; return 0; } else { top->link = NULL; } return top; } int isEmpty(pnode top)//判断是否为空栈 { if(top->link == NULL) { return 0; } else { return 1; } } //进栈操作 void push(pnode top){ cout << "****************进栈操作**************" << endl; int data,n,i=1; cout<<"请输入入栈的结点个数:"; cin>>n; while(n--) { pnode pnew =new node; int m; if(pnew == NULL) { cout<<"入栈失败!"<<endl; return ; } cout<<"请输入第"<<i<<"个入栈数据:"; cin>>m; (*pnew).data = m; (*pnew).link = (*top).link; (*top).link = pnew; i++; } cout<<"入栈成功!"<<endl; } void pop(pnode top) { cout << "****************出栈操作**************" << endl; if(top->link==NULL){ cout<<"此栈为空!"<<endl; return ; } int n; cout<<"请输入出栈的结点个数:"; cin>>n; while(n--) { pnode tmp = top->link; top->link = tmp->link; free(tmp); } cout<<"出栈成功!"<<endl; } void showStack(pnode top)//展示栈的所以结点内容 { cout << "****************遍历操作**************" << endl; int i = 1; pnode pt = top->link; if(!isEmpty(top)) { cout << "栈为空" << endl; return; } else { while(pt != NULL) { cout << "第" << i << "个栈数据为:" ; cout << pt->data << endl; pt = pt->link; i++; } } } void destoryStack(pnode top)//清空销毁栈 { cout << "****************销毁操作**************" << endl; if(!isEmpty(top)) { cout << "栈已经为空" << endl; return; } else { pnode temp; while(top->link != NULL) { temp = top->link; top->link = temp->link; free(temp); } cout << "销毁成功" << endl; } } int main() { pnode top; top = creatStack(); push(top); showStack(top); pop(top); showStack(top); //destoryStack(top); return 0; }