以下是数据结构中关于顺序栈的声明、初始化、判断空与满、入栈、出栈、遍历栈等基础操作(编程风格参考严蔚敏数据结构)。

头文件及宏

#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; 
}

步骤:

  1. 给栈底指针分配内存空间
  2. 给栈底指针分配内存空间
  3. 栈顶指针指向栈底指针
  4. 给栈设置尺寸大小

判断空与满

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);
	}
}

步骤:

  1. 判断栈是否为满栈状态;
  2. 输入新元素;
  3. 新元素赋给栈顶的位置;
  4. 栈顶往前移动一个位置。

出栈

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);
} 

步骤:

  1. 判断栈是否为空;
  2. 将栈顶地址往后移动一个位置(因为栈顶每添加一个元素都往前移动一位,每次栈顶指向的位置都是没有数据的,所以要先往后退一个位置)
  3. 将值取出。

遍历栈

void showStack(Sqstack &st){
	if(isNotEmpty(st)){
		cout<<"栈当前元素:"<<endl;
		SElemType *p = st.base;
		while(p != st.top){
			cout<<*p++<<" ";
		}
		cout<<endl;
	}
} 

步骤:

  1. 声明一个中间指针指向栈底;
  2. 中间指针从栈底向栈顶移动,直到与栈顶汇合。

源代码

/*
		广西师范大学 计算机科学与工程学院 
		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;
} 

运行截图

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

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

更多推荐