如果要实现一个顺序栈,首先我们就需要有个静态数组,同时还需要有个数组的长度。其次呢我们需要有两个指针,一个指针指向栈顶,一个指向栈底(主要是方便入栈,出栈操作方便)
栈的初始化
有了这个思路之后,我们就可以进行栈的初始化了。那么初始化的需要让咱们栈有个固定长度
吧,那我们就得给他分配一个数组
,其次呢,一开始阶段,我们栈里(目前是个数组)是什么值都没有的,所以我们就需要让两个指针指向数组的最底部
吧。有了这些基础之后,我们就可以用代码实现啦。
代码见下: 内联代码片
。
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; //栈的长度
}
入栈
入栈很明显,就是将一个值存入到栈,并且处于栈顶部
。
这里入栈操作我们需要考虑, 栈会不会满?
,满了怎么操作。如果说栈满了,我们就不能在进行操作了,我们就友情提示一下,若不满,我们就可以操作,这时,我们就把需要入栈的值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("入栈成功");
}
出栈
出栈,顾名思义,就是将栈内元素拿出来
,当然根据栈的规则,先进后出原则
,所以我们应将栈顶的元素先取出来
,但是呢,我们的栈是不是空的?
,如果空的还有什么能出栈呢?,所以出战要进行判断栈是否为空
代码如下:
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);
}