如果栈的使用过程中元素数目变化不可预测,有时很小,有时很大,则最好使用链栈;反之,如果它的变化在可控范围内,使用顺序栈会好一些。
简单的栈的链式存储结构代码如下:
/*LinkStack.h*/ #include<iostream> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int SElemType; typedef int Status; class StackNode{ public: StackNode():data(0) {}; SElemType data; StackNode *next; }; class LinkStack{ public: LinkStack():count(0){}; StackNode* top; int count; Status Push(SElemType e); /*进栈操作*/ Status Pop(SElemType *e); /*出栈操作*/ Status ShowStack() const; }; Status LinkStack::Push(SElemType e) { StackNode* s=new StackNode; s->data=e; s->next=top; top=s; count++; return OK; } Status LinkStack::Pop(SElemType *e) { if (count<=0) return ERROR; StackNode* p=new StackNode; *e=top->data; p=top; top=top->next; delete p; count--; return OK; } Status LinkStack::ShowStack() const { if (count<=0) return FALSE; StackNode* p; p=top; int k=count; std::cout<<"按从栈顶至栈底依次显示:"; while(k) { std::cout<<p->data<<" "; p=p->next; k--; } std::cout<<std::endl; return OK; }
另:
栈的应用:
1、递归
2、四则运算表达式求值。
分两步:
step1、中缀表达式转后缀表达式(栈用来进出运算的符号);
step2、对后缀表达式进行运算(栈用来进出运算的数字)。