数据结构(C++语言版)实现顺序栈的创建,初始化,赋值随机数,入栈,出栈,获取栈顶元素,输出
1.栈:
栈是一种运算受限的线性表,是一种先进后出的数据结构,限定只能在一端进行插入和删除操作,允许操作的一端称为栈顶,不允许操作的称为栈底
2.顺序栈(顺序结构):
栈的顺序存储结构简称为顺序栈
它类似于线性表的顺序存储结构,是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素
通常用一维数组来实现栈的顺序存储,一般以数组小下标一端做栈底,每进栈一个元素,指针top+1,每出栈一个元素,top-1
3.图示:
- 空栈
- 存有数据的顺序栈
4.代码块
- 顺序栈的定义
typedef struct{
//top指针指向栈顶
SElemType *top;
//base指针指向栈底
SElemType *base;
//顺序栈的大小
int stackSize;
}SqStack;
- 顺序栈的初始化
//顺序栈S初始化
Status InitStack(SqStack &S){
//动态分配一个SElemType类型MAXSIZE长度的空间
//将地址给顺序栈S的栈底指针
S.base = new SElemType[MAXSIZE];
//判断,若顺序栈的栈底指针(S.base)为空,没有地址,则没有分配成功
if(!S.base) return ERROR;
//空的顺序栈,所以栈顶指针=栈底指针
S.top=S.base;
// 空的顺序栈,由MAXSIZE个空间可以存
S.stackSize = MAXSIZE;
return OK;
}
- 顺序栈进栈
//进栈,将e压入顺序栈S中
Status push(SqStack &S,SElemType e){
//判断栈是否满栈
if(S.top-S.base==S.stackSize) return ERROR;
//将e存入S.top,存入栈顶,栈顶指针top++向上移动
*S.top++=e;
return OK;
}
- 顺序栈出栈
//出栈,将栈顶元素给e
Status pop(SqStack &S,SElemType &e){
//判断栈内是否有元素,为空栈
if(S.top==S.base) return ERROR;
//栈顶指针下移,将栈顶元素赋给e
e=*--S.top;
return OK;
}
- 取栈顶元素
//取栈顶元素 ,赋值给e
Status GetTop(SqStack S,SElemType &e){
//判断栈内是否有元素,为空栈
if(S.top==S.base) return ERROR;
//返回栈顶元素的值,栈顶指针不变
e=*(S.top-1);
return OK;
}
- 遍历输出栈元素
//输出栈元素
Status printStack(SqStack S){
SElemType *p=S.base;
while(p!=S.top){
cout<<*p<<"\t";
p++;
}
cout<<endl;
}
- 顺序栈赋随机值
Status inStack(SqStack &S,int i){
for(int j=0;j<i;j++){
//判断是否栈满
if(S.top-S.base==S.stackSize) return ERROR;
*S.top++=rand();
}
return OK;
}
5.代码实现
#include<iostream>
#include<stdlib.h>
using namespace std;
#define ERROR 0
#define OK 1
#define MAXSIZE 100
typedef int SElemType;
typedef int Status;
typedef struct{
//top指针指向栈顶
SElemType *top;
//base指针指向栈底
SElemType *base;
//顺序栈的大小
int stackSize;
}SqStack;
//创建空的顺序栈 S
Status InitStack(SqStack &S){
//动态分配一个SElemType类型MAXSIZE长度的空间
//将地址给顺序栈S的栈底指针
S.base = new SElemType[MAXSIZE];
//判断,若顺序栈的栈底指针(S.base)为空,没有地址,则没有分配成功
if(!S.base) return ERROR;
//空的顺序栈,所以栈顶指针=栈底指针
S.top=S.base;
// 空的顺序栈,由MAXSIZE个空间可以存
S.stackSize = MAXSIZE;
return OK;
}
//入栈,将e压入顺序栈S中
Status push(SqStack &S,SElemType e){
//判断栈是否满栈
if(S.top-S.base==S.stackSize) return ERROR;
//将e存入S.top,存入栈顶,栈顶指针top++向上移动
*S.top++=e;
return OK;
}
//出栈,将栈顶元素给e
Status pop(SqStack &S,SElemType &e){
//判断栈内是否有元素,为空栈
if(S.top==S.base) return ERROR;
//栈顶指针下移,将栈顶元素赋给e
e=*--S.top;
return OK;
}
//取栈顶元素 ,赋值给e
Status GetTop(SqStack S,SElemType &e){
//判断栈内是否有元素,为空栈
if(S.top==S.base) return ERROR;
//返回栈顶元素的值,栈顶指针不变
e=*(S.top-1);
return OK;
}
//输出栈元素
Status printStack(SqStack S){
SElemType *p=S.base;
while(p!=S.top){
cout<<*p<<"\t";
p++;
}
cout<<endl;
}
//赋值
Status inStack(SqStack &S,int i){
for(int j=0;j<i;j++){
//判断是否栈满
if(S.top-S.base==S.stackSize) return ERROR;
*S.top++=rand();
}
return OK;
}
int main(){
//定义栈S
SqStack S;
int e;
// 顺序栈初始化
InitStack(S);
//为顺序栈赋值
cout<<"为顺序栈赋值多少个随机值:"<<endl;
cin>>e;
//为顺序栈随机赋值e个元素
inStack(S,e);
cout<<"顺序栈赋值完成:"<<endl;
//遍历打印顺序栈
printStack(S);
cout<<"顺序栈进栈:"<<endl;
cout<<"要进栈的元素是:"<<endl;
cin>>e;
//将e压栈
push(S,e);
cout<<"顺序栈进栈完成:"<<endl;
printStack(S);
cout<<"顺序栈出栈:"<<endl;
//栈顶元素出栈给e
pop(S,e);
cout<<"顺序栈出栈完成:"<<endl;
printStack(S);
cout<<"出栈元素为:"<<endl;
cout<<e<<endl;
cout<<"顺序栈栈顶元素:"<<endl;
//获取栈顶元素
GetTop(S,e);
cout<<e<<endl;
return 0;
}