分析

如果要实现一个顺序栈,首先我们就需要有个静态数组,同时还需要有个数组的长度。其次呢我们需要有两个指针,一个指针指向栈顶,一个指向栈底(主要是方便入栈,出栈操作方便)

栈的初始化

有了这个思路之后,我们就可以进行栈的初始化了。那么初始化的需要让咱们栈有个固定长度吧,那我们就得给他分配一个数组,其次呢,一开始阶段,我们栈里(目前是个数组)是什么值都没有的,所以我们就需要让两个指针指向数组的最底部吧。有了这些基础之后,我们就可以用代码实现啦。

顺序栈实现C++_C/C
代码见下: 内联代码片

1.定义一个长度	#define MAXSIZE 100
2.需要定义一个结构体,存长度以及两个指针 。来表示栈
3.定义一个int类型的新变量typedef int SElemType;  (为了方便而定义,不定义用int也行)
4.初始化(即定义一个数组,和两个指针指向相等)。
//顺序栈(后进先出)
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int SElemType;

typedef  struct{
    SElemType *base;
    SElemType *top;
    int stacksize;//最大容量
}SqStack;
//1.初始化
void init(SqStack &S){
    S.base=new SElemType[MAXSIZE];//定义一个int类型 长度为MAXSIZE的数组
    if(!S.base) exit; //如果不存在就退出
    S.top=S.base; //栈顶和栈底指向相等
    S.stacksize=MAXSIZE;  //栈的长度
}

入栈

顺序栈实现C++_C/C_02
顺序栈实现C++_C/C_03

入栈很明显,就是将一个值存入到栈,并且处于栈顶部
这里入栈操作我们需要考虑, 栈会不会满?,满了怎么操作。如果说栈满了,我们就不能在进行操作了,我们就友情提示一下,若不满,我们就可以操作,这时,我们就把需要入栈的值e存入栈
具体操作:

1.先判断栈是否满
2.不满,就先将值存入栈(因为此时初始化指向的值为空嘛!可以看初始化的图理解)
3.然后就需要将栈顶指针向上移动啦!

代码如下:

//2.入栈
void push(SqStack &S,SElemType e){
    if(S.top-S.base==S.stacksize) printf("该栈已满");
    *S.top=e;
    S.top++;
    printf("入栈成功");
}

出栈

顺序栈实现C++_C/C_04

出栈,顾名思义,就是将栈内元素拿出来,当然根据栈的规则,先进后出原则,所以我们应将栈顶的元素先取出来,但是呢,我们的栈是不是空的?,如果空的还有什么能出栈呢?,所以出战要进行判断栈是否为空

代码如下:

1.判断栈是否为空
2.先取出栈顶元素,用一个变量存储
3.将栈顶指针向下移动一个单位
//3.出栈
void pop(SqStack &S,SElemType e){
    if(S.top==S.base) printf("该栈为空");
    S.top--;
    e=*S.top;
    printf("出栈成功");

}

遍历取栈内元素

主要分为从栈顶输出栈底输出两种方式
代码如下:
栈顶输出

//6.遍历输出栈内元素(从栈顶进行输出)
void printStackTop(SqStack S){
      printf("栈顶:");
while(S.top!=S.base){
    printf("%d ",*(S.top-1));   //因为一开始栈顶指针指向有值的上方,可以看入栈的图例
    S.top--;
}
printf("\n");
}

栈底输出

//5.遍历输出栈内元素(从栈底进行输出)
void printStackBottom(SqStack S){
   printf("栈底:");
   SElemType *p=S.base;
   while(p!=S.top){
    printf("%d  ",*p);
    p++;

   }
   printf("\n");

}

取栈顶元素

基本和取值类似,这里就不多说!

//4.取栈顶元素
SElemType  getTop(SqStack S){
    //非栈空时返回
    if(S.top!=S.base){
        return *(S.top-1);
    }
}

????基本上顺序栈就这么多!
但是我之前遇到一个问题就是为什么有什么需要&有时候不需要&呢
比如pop(SqStack &S,SElemType e)和printStackTop(SqStack S)

于是我找同学得出的结论就是

	就是说如果我需要改变栈内的值就需要用到&,如果只是简单的做输出而不需要改变内部值就不需要&

完整代码

//顺序栈(后进先出)
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int SElemType;

typedef  struct{
    SElemType *base;
    SElemType *top;
    int stacksize;//最大容量
}SqStack;

/**
满足先进后出原则  。所以7是按照次原则实现
1.初始化
2.判断是否为空
3.判断是否满
4.入栈
5.出栈
6.取栈顶元素
7.遍历输出栈内元素
*/
//1.初始化
void init(SqStack &S){
    S.base=new SElemType[MAXSIZE];
    if(!S.base) exit;
    S.top=S.base;
    S.stacksize=MAXSIZE;
}

//2.入栈
void push(SqStack &S,SElemType e){
    if(S.top-S.base==S.stacksize) printf("该栈已满");
    *S.top=e;
    S.top++;
    printf("入栈成功");
}
//3.出栈
void pop(SqStack &S,SElemType e){
    if(S.top==S.base) printf("该栈为空");
    S.top--;
    e=*S.top;
    printf("出栈成功");

}
//4.取栈顶元素
SElemType  getTop(SqStack S){
    //非栈空时返回
    if(S.top!=S.base){
        return *(S.top-1);
    }
}
//5.遍历输出栈内元素(从栈底进行输出)
void printStackBottom(SqStack S){
   printf("栈底:");
   SElemType *p=S.base;
   while(p!=S.top){
    printf("%d  ",*p);
    p++;

   }
   printf("\n");

}
//6.遍历输出栈内元素(从栈顶进行输出)
void printStackTop(SqStack S){
      printf("栈顶:");
while(S.top!=S.base){
    printf("%d ",*(S.top-1));
    S.top--;
}
printf("\n");
}

int main(){

SqStack S;
int e;
 printf("初始化顺序栈");
init(S);//初始化
//进行输入,准备入栈操作
printf("请输入一个要入栈的元素(-1表示结束):");
scanf("%d",&e);
while(e!=-1){
    push(S,e);
    printf("请输入一个要入栈的元素(-1表示结束):");
    scanf("%d", &e);
}
//进行输出
printStackBottom(S);


printf("出栈测试:");
pop(S,e);
printStackBottom(S);
printf("取栈顶元素测试:");
e=getTop(S);
printf("取出的栈顶元素为:%d\n",e);
}