栈:后进先出、操作受限制的线性表
1. 定义栈
-1.1 静态数组
int lengthS =0;
typedef struct {
//静态数组实现的栈
int data[MAX_size];
int top;
}SqStack;
-1.2链表
typedef struct LinkNode{
//实现的是无头节点的链栈
int data;
struct LinkNode *next;
} *ListStack;
2. 初始化
void InitS(SqStack &S){
S.top = -1;
}
3. 栈空判断
bool emptyS(SqStack S){
if(S.top == -1){
return true;
}else
return false;
}
4. 进栈
bool pushS(SqStack &S,int c){
if(lengthS == MAX_size){
return false;
}
S.data[++S.top] = c;
lengthS += 1;
return true;
}
5.出栈&取出栈顶元素
bool popS(SqStack &S,int &c){
if(emptyS(S)){
return false;
}
c = S.data[S.top--];
lengthS--;
return true;
}
void getTOP(SqStack S){
if(emptyS(S)){
cout<<"ERROR:表空无数据"<<endl;
}else{
cout<<"【取出栈顶元素】:"<<S.data[S.top]<<endl;
}
}
6. 预览-查看
void view(SqStack S){
for(int i = 0; i< lengthS;i++){
cout<<"i="<<i<<",data="<<S.data[i]<<endl;
}
cout<<"栈存数据个数:"<<lengthS<<endl;
}
7. 测试
cout << "Hello world!2021-7-9" << endl;
SqStack S;
InitS(S);
cout<<emptyS(S)<<endl;
for(int i=0;i <10;i++){
pushS(S,i);
}
view(S);
getTOP(S);
{
int c;bool flag = popS(S,c);
cout<<"弹出栈顶元素:"<<c<<"返回状态:"<<flag<<endl;
}
{
int c;bool flag = popS(S,c);
cout<<"弹出栈顶元素:"<<c<<"返回状态:"<<flag<<endl;
}
{
int c;bool flag = popS(S,c);
cout<<"弹出栈顶元素:"<<c<<"返回状态:"<<flag<<endl;
}
view(S);
getTOP(S);
return 0;
8. 结果分析
- 存入10个元素,栈数据正常,个数正常
- 取出栈顶元素是9,后进先出,正常
- 出栈3次正常,顺序987,正常,返回状态1,正常