数据结构——顺序栈2(声明、初始化、判断空与满、入栈、出栈、遍历栈)
·
以下是数据结构中关于顺序栈的声明、初始化、判断空与满、入栈、出栈、遍历栈等基础操作(编程风格参考严蔚敏数据结构)。
头文件及宏
#include<iostream>
#include<stdio.h>
using namespace std;
#define MAXSIZE 5
#define SElemType char
#define Status int//表示函数运行状态
#define OK 1
#define ERROR 0
#define STOP 0
#define OVERFLOW 0
定义栈的尺寸为5个元素;
声明
typedef struct SqStack{
SElemType *base;//栈底
SElemType *top;//栈顶
int stacksize;
}Sqstack;
属性说明:
定义一个栈底指针和一个栈顶指针,用来表示栈元素的位置;
定义一个栈尺寸防止栈溢出;
初始化
Status initial(Sqstack &st){
st.base = new SElemType[MAXSIZE];//给栈底指针分配内存空间
if(!st.base)//如果内存分配失败
return ERROR;
st.top = new SElemType[MAXSIZE];//给栈底指针分配内存空间
st.top = st.base;//最初是空栈,栈底和栈顶都是一样的位置
st.stacksize = MAXSIZE;
return OK;
}
步骤:
- 给栈底指针分配内存空间
- 给栈底指针分配内存空间
- 栈顶指针指向栈底指针
- 给栈设置尺寸大小
判断空与满
Status isNotFull(Sqstack &st){
if(st.top-st.base == st.stacksize){
cout<<"栈满!"<<endl;
return ERROR;
}
return OK;
}
Status isNotEmpty(Sqstack &st){
if(st.top==st.base){
cout<<"栈空!"<<endl;
return ERROR;
}
return OK;
}
判断栈满:如果栈顶指针地址-栈底指针的值等于栈的尺寸,就是栈空状态。
因为指针是往下一个内存空间移动的,所以两个指针地址相减得出的是两个指针的距离(整形数据)。
判断栈空:如果栈顶指针地址等于栈底指针,就是栈空状态。
入栈
Status push(Sqstack &st,SElemType elem){
*st.top++ = elem;//当前栈顶的位置赋值后栈顶指针移向下一个位置
return OK;
}
void pushElem(Sqstack &st){
SElemType elem = '0';
Status flag = isNotFull(st);
while(elem!='*' && flag){
cout<<"请输入元素(输入*结束进栈):";
cin>>elem;
if(elem!='*'){
push(st,elem);
}
flag = isNotFull(st);
}
}
步骤:
- 判断栈是否为满栈状态;
- 输入新元素;
- 新元素赋给栈顶的位置;
- 栈顶往前移动一个位置。
出栈
Status pop(Sqstack &st,SElemType &elem){
elem = *--st.top;//因为栈顶每添加一个元素都往前移动一位,每次栈顶指向的位置都是没有数据的,所以要先往后退一个位置
return OK;
}
void popElem(Sqstack &st){
SElemType elem;
if(isNotEmpty(st)){
if(pop(st,elem))
cout<<"出栈成功,本次出栈元素为:"<<elem<<endl;
}
showStack(st);
}
步骤:
- 判断栈是否为空;
- 将栈顶地址往后移动一个位置(因为栈顶每添加一个元素都往前移动一位,每次栈顶指向的位置都是没有数据的,所以要先往后退一个位置)
- 将值取出。
遍历栈
void showStack(Sqstack &st){
if(isNotEmpty(st)){
cout<<"栈当前元素:"<<endl;
SElemType *p = st.base;
while(p != st.top){
cout<<*p++<<" ";
}
cout<<endl;
}
}
步骤:
- 声明一个中间指针指向栈底;
- 中间指针从栈底向栈顶移动,直到与栈顶汇合。
源代码
/*
广西师范大学 计算机科学与工程学院
GuangXi Normal University
College of Computer Science and Engineering
Student STZ
*/
#include<iostream>
#include<stdio.h>
using namespace std;
#define MAXSIZE 5
#define SElemType char
#define Status int//表示状态
#define OK 1
#define ERROR 0
#define STOP 0
#define OVERFLOW 0
typedef struct SqStack{
SElemType *base;//栈底
SElemType *top;//栈顶
int stacksize;
}Sqstack;
Status initial(Sqstack &st){
st.base = new SElemType[MAXSIZE];//给栈底指针分配内存空间
if(!st.base)//如果内存分配失败
return ERROR;
st.top = new SElemType[MAXSIZE];//给栈底指针分配内存空间
st.top = st.base;//最初是空栈,栈底和栈顶都是一样的位置
st.stacksize = MAXSIZE;
return OK;
}
Status isNotFull(Sqstack &st){
if(st.top-st.base == st.stacksize){
cout<<"栈满!"<<endl;
return ERROR;
}
return OK;
}
Status isNotEmpty(Sqstack &st){
if(st.top==st.base){
cout<<"栈空!"<<endl;
return ERROR;
}
return OK;
}
void showStack(Sqstack &st){
if(isNotEmpty(st)){
cout<<"栈当前元素:"<<endl;
SElemType *p = st.base;
while(p != st.top){
cout<<*p++<<" ";
}
cout<<endl;
}
}
Status push(Sqstack &st,SElemType elem){
*st.top++ = elem;
return OK;
}
void pushElem(Sqstack &st){
SElemType elem = '0';
Status flag = isNotFull(st);
while(elem!='*' && flag){
cout<<"请输入元素(输入*结束进栈):";
cin>>elem;
if(elem!='*'){
push(st,elem);
}
flag = isNotFull(st);
}
}
Status pop(Sqstack &st,SElemType &elem){
elem = *--st.top;//因为栈顶每添加一个元素都往前移动一位,每次栈顶指向的位置都是没有数据的,所以要先往后退一个位置
return OK;
}
void popElem(Sqstack &st){
SElemType elem;
if(isNotEmpty(st)){
if(pop(st,elem))
cout<<"出栈成功,本次出栈元素为:"<<elem<<endl;
}
showStack(st);
}
void menu(Sqstack &st){
int c = 0;
while(1){
cout<<"请选择操作:"<<endl;
cout<<"1:入栈"<<endl;
cout<<"2:出栈"<<endl;
cout<<"3:遍历栈"<<endl;
cout<<"4:退出"<<endl;
cin>>c;
switch(c){
case 1:pushElem(st);break;
case 2:popElem(st);break;
case 3:showStack(st);break;
case 4:return;
default:;
}
}
}
int main(){
Sqstack st;
if(!initial(st))
cout<<"栈初始化失败!"<<endl;
else
cout<<"栈初始化完毕!"<<endl;
menu(st);
return 0;
}
运行截图




魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)