栈之顺序栈(包含完整代码)C语言版

看一下关于栈的思维导图

栈之顺序栈(包含完整代码)C语言版_第1张图片栈是只允许在一端进行插入或删除操作的线性表,按照物理结构的不同,栈又分为顺序栈和链栈。
本篇文章是顺序栈的专场。
栈之顺序栈(包含完整代码)C语言版_第2张图片来看实现各个功能的代码块

//顺序栈的定义
#define MaxSize 10 //定义栈中最大元素的个数
typedef struct{
	elemtype data[MaxSize]; //静态数组存放栈中元素,销毁栈时不必手动释放空间
	int top; //定义栈顶指针
}SqStack;

//初始化栈
void InitStack(SqStack &S){
	S.top=-1; 
}
void testStack(){
	SqStack S; //声明一个顺序栈(分配空间)
	InitStack(S);
}

//判空
bool StackEmpty(SqStack S){
	if(S.top==-1) return true;
	else  return false;
}

//新元素入栈
bool Push(SqStack &S,elemtype x){
	if(S.top==MaxSize-1) return false //栈满,报错
	S.data[++S.top]=x; //指针先加1再让新元素入栈
	return true;
}

//出栈操作
bool Pop(SqStack &S,elemtype &x){
	if(S.top==-1) return false; //栈为空
	x=S.data[S.top--];
	return true;
}

//获取栈顶元素
bool GetTop(SqStack S,elemtype &x){
	if(S.top==-1) return false; //栈为空
	x=S.data[S.top];
	return true;
}

顺序栈的缺点是栈的大小不能改变,也就是说顺序栈对空间的利用率不高,解决这一缺点除了使用链栈,还可以定义一种共享栈。

#define MaxSize 10
typedef struct{
	elemtype data[MaxSize];
	int top0; //0号栈顶指针
	int top1; //1号栈顶指针
}ShStack;
//初始化栈
void InitStack(SqStack &S){
	S.top0=-1;
	S.top1=MaxSize;
}

完整代码如下:

#include 
#include 

#define MaxSize 10 //定义栈中最大元素的个数
typedef int elemtype;
typedef struct{
	elemtype data[MaxSize]; //静态数组存放栈中元素,销毁栈时不必手动释放空间
	int top; //定义栈顶指针
}SqStack;

//初始化栈
void InitStack(SqStack &S){
	S.top=-1; 
}
void testStack(){
	SqStack S; //声明一个顺序栈(分配空间)
	InitStack(S);
}

//判空
bool StackEmpty(SqStack S){
	if(S.top==-1) return true;
	else  return false;
}

//新元素入栈
bool Push(SqStack &S,elemtype x){
	if(S.top==MaxSize-1) return false; //栈满,报错
	S.data[++S.top]=x; //指针先加1再让新元素入栈
	return true;
}

//出栈操作
bool Pop(SqStack &S,elemtype &x){
	if(S.top==-1) return false; //栈为空
	x=S.data[S.top--];
	return true;
}

//获取栈顶元素
bool GetTop(SqStack S,elemtype &x){
	if(S.top==-1) return false; //栈为空
	x=S.data[S.top];
	return true;
}
void menu(){
	printf("请选择要进行的操作[1-6]:\n");
	printf("1.初始化顺序栈;\n");
	printf("2.判断顺序栈是否为空;\n");
	printf("3.入栈;\n");
	printf("4.出栈;\n");
	printf("5.获取栈顶元素;\n");
	printf("0.退出。\n");
}
int main(){
	SqStack S;
	int choose;
	elemtype x;
	menu();
	scanf("%d",&choose);
	while(choose!=0){
		switch(choose){
			case 1:{ 
				testStack();
				printf("初始化成功!\n");
				break;
			} 
			case 2:{
				bool f=StackEmpty(S); 
				if(f==true) printf("空栈!\n");
				else printf("非空!\n");
				break;
			}
			case 3:{ 
				printf("请输入要入栈的元素:\n");
				scanf("%d",&x);
				if(Push(S,x)) printf("入栈成功!\n");
				else printf("入栈失败!\n");
				break;
			} 
			case 4:{
				if(Pop(S,x)) printf("元素%d出栈成功!\n",x);
				else printf("出栈失败!");
				break;
			}
			case 5:{
			    if(GetTop(S,x)) printf("栈顶元素为:%d\n",x);
				else printf("获取失败!\n");
				break; 
			}
			default:{
				printf("输入有误,请重新输入!\n");
				break;
			}
		}	
		menu();	
		scanf("%d",&choose);
	}
	return 0;
}

你可能感兴趣的:(数据结构学习笔记,栈,数据结构)