以下是数据结构中关于顺序栈的声明、声明、初始化、判断空与满、入栈、出栈、遍历栈等基础操作(编程风格参考天勤数据结构)。
头文件及宏
#include<iostream>
#include<stdio.h>
using namespace std;
#define MAXSIZE 5
为了测试方便,栈的最大尺寸设置为5。
声明
typedef struct SqStack{
int data[MAXSIZE];//数据
int top;//栈顶
}Sqstack;
两个属性:data是存放数据的数组,top用来表示栈顶。
初始化
void initial(Sqstack &st){
st.top = -1;//当top为-1时,顺序栈为空;
}
在这里设置top=-1表示栈空。当有元素进栈时,top先自增成0,这样设计数组的下标可以直接用top表示,紧接着元素按照下标入栈。
当然,如果top=0,那就是数组下标用top表示元素入栈的位置,然后再自加1。
判断空栈/满栈
int isNotFull(Sqstack &st){
if(st.top != MAXSIZE-1){//因为是从-1开始算的,所以要-1
return 1;
}else{
cout<<"栈已满。"<<endl;
return 0;
}
}
int isNotEmpty(Sqstack &st){
if(st.top != -1){
return 1;
}else{
cout<<"栈已空。"<<endl;
return 0;
}
}
判断满栈是用top != MAXSIZE - 1(因为下标从0开始算);
判断空栈依然是top != -1。
入栈
void push(Sqstack &st,int data){
++st.top;
st.data[st.top] = data;
}
void addElem(Sqstack &st){
int data = 0;
while(data != -1 && isNotFull(st)){
cout<<"请输入新增data(输入-1跳出):" ;
cin>>data;
if(data!=-1)
push(st,data);
}
}
步骤:
1、表示栈顶的top自加1(因为top初始值-1);
2、将数据写入栈data。
(如果是top的初始值是0,则步骤1、2顺序调换)
出栈
void pop(Sqstack &st,int &x){
x = st.data[st.top];
st.top--;
}
void popElem(Sqstack &st){
int x;
if(isNotEmpty(st)){
pop(st,x);
cout<<"出栈data为:"<<x<<endl;
}
showStack(st);
}
步骤:
1、先判断栈是否为空;
2、然后将栈顶的值取出(出栈);
3、栈顶值top自减1。
遍历栈
void showStack(Sqstack &st){
if(!isNotEmpty(st)){
return ;
}
cout<<"当前栈的元素为:"<<endl;
for(int i=0;i<=st.top;i++){
cout<<st.data[i]<<" ";
}
cout<<endl;
}
直接像数组那样遍历即可。
源代码
/*
广西师范大学 计算机科学与工程学院
GuangXi Normal University
College of Computer Science and Engineering
Student STZ
*/
#include<iostream>
#include<stdio.h>
using namespace std;
#define MAXSIZE 5
typedef struct SqStack{
int data[MAXSIZE];//数据
int top;//栈底
}Sqstack;
void initial(Sqstack &st){
st.top = -1;//当top为-1时,顺序栈为空;
}
int isNotFull(Sqstack &st){
if(st.top != MAXSIZE-1){//因为是从-1开始算的,所以要-1
return 1;
}else{
cout<<"栈已满。"<<endl;
return 0;
}
}
int isNotEmpty(Sqstack &st){
if(st.top != -1){
return 1;
}else{
cout<<"栈已空。"<<endl;
return 0;
}
}
void showStack(Sqstack &st){
if(!isNotEmpty(st)){
return ;
}
cout<<"当前栈的元素为:"<<endl;
for(int i=0;i<=st.top;i++){
cout<<st.data[i]<<" ";
}
cout<<endl;
}
void push(Sqstack &st,int data){
++st.top;
st.data[st.top] = data;
}
void addElem(Sqstack &st){
int data = 0;
while(data != -1 && isNotFull(st)){
cout<<"请输入新增data(输入-1跳出):" ;
cin>>data;
push(st,data);
}
}
void pop(Sqstack &st,int &x){
x = st.data[st.top];
st.top--;
}
void popElem(Sqstack &st){
int x;
if(isNotEmpty(st)){
pop(st,x);
cout<<"出栈data为:"<<x<<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:addElem(st);break;
case 2:popElem(st);break;
case 3:showStack(st);break;
case 4:return;
default:;
}
}
}
int main(){
Sqstack st;
initial(st);
menu(st);
return 0;
}
运行截图