数据结构(顺序栈的实现)

(学习数据结构需要从其逻辑结构,运算,存储结构入手)

一.栈

1.逻辑结构(定义):只允许在一端进行插入或删除操作的线性表

2.运算(操作):创销,入栈,出栈,读栈顶,判空

3.存储结构:顺序存储->顺序栈,链式存储->链栈

二.代码实现

1.创建栈

#define MaxSize 10//栈中元素的最大个数 
//   -1是栈顶指针的初始化位置  [0,1,2,3,4,5,6,7,8,9] 
typedef struct{
	int data[MaxSize];//一个存放栈中数据元素的结构体 
	int top;//指向栈顶的指针
	int size; 
}SqStack;//定义栈的结构体 

定义结构体

SqStack S;//声明一个顺序栈
InitStack(&S);//初始化 

分配空间

void InitStack(SqStack *S){//初始化 
	S->top=-1;//栈顶指针指向初始化位置 
	S->size = 0;
}

 2.入栈操作

bool Push(SqStack *S,int pushNum){//入栈 
	if(S->size>9){//栈满 
		return false;//入栈失败 
	}
	S->data[++S->top]=pushNum;//入栈 
    //请注意是先将栈顶指针向后移位,后赋值
	S->size++;//栈长+1 
	return true;
}

 3.出栈操作

bool Pop(SqStack *S,int *popNum){//出栈操作 
	if(S->size==0){//栈中没有元素 
		return false;
	}
	*popNum = S->data[S->top--];//和读栈的区别在出栈将栈顶指针下移一位
	S->size--;//计数-1 
	return true; 
}

4.读取栈顶元素

bool ReadTop(SqStack *S,int *readNum){
	if(S->size==0){//栈中没有元素 
		return false;
	}
	*readNum = S->data[S->top];
//	printf("栈顶元素是%d\n",readNum);
	return true;
}

三.代码整体

//顺序栈 
#include <stdio.h>
#include <stdlib.h>

#define MaxSize 10//栈中元素的最大个数 
//   -1是栈顶指针的初始化位置  [0,1,2,3,4,5,6,7,8,9] 
typedef struct{
	int data[MaxSize];//一个存放栈中数据元素的结构体 
	int top;//指向栈顶的指针
	int size; 
}SqStack;//定义栈的结构体 

void InitStack(SqStack *S){//初始化 
	S->top=-1;//栈顶指针指向初始化位置 
	S->size = 0;
}
bool Push(SqStack *S,int pushNum){//入栈 
	if(S->size>9){//栈满 
		return false;//入栈失败 
	}
	S->data[++S->top]=pushNum;//入栈 
	S->size++;//栈长+1 
	return true;
}
bool ReadTop(SqStack *S,int *readNum){
	if(S->size==0){//栈中没有元素 
		return false;
	}
	*readNum = S->data[S->top];
//	printf("栈顶元素是%d\n",readNum);
	return true;
}

bool Pop(SqStack *S,int *popNum){//出栈操作 
	if(S->size==0){//栈中没有元素 
		return false;
	}
	*popNum = S->data[S->top--];//和读栈的区别在出栈将栈顶指针下移一位
	S->size--;//计数-1 
	return true; 
}

int main(){
	bool flag = true;
	SqStack S;//声明一个顺序栈
	InitStack(&S);//初始化 
	
	//入栈 
	int pushNum = 0;//记录入栈元素的变量 
	printf("请向栈中输入元素(输入99结束):");
	scanf("%d",&pushNum);
	while(pushNum != 99){
		flag=Push(&S,pushNum);//入栈 
		if(flag){
			printf("\n请向栈中输入元素(输入99结束):");
			scanf("%d",&pushNum);
		}else{
			printf("入栈失败");
			exit(0);
		}
		
	}
	
	//读栈
	int readNum = 0;
	ReadTop(&S,&readNum);//读取栈顶元素
	printf("栈顶元素是%d\n",readNum);
	
	//出栈
	int popNum = 0;//存储出栈元素的变量 
	char elect = NULL;//判断是否继续出栈的变量 
	printf("是否出栈元素(y|x):");
	scanf("%s",&elect);
	while(elect == 'y'){
		flag = Pop(&S,&popNum);	//调用出栈操作 
		if(flag == false){
			printf("\n栈已空");
			exit(0);
		}else{
			printf("\n出栈元素为%d",popNum);
		}
		printf("\n是否出栈元素(y|x):");
		scanf("%s",&elect);
	}

	 
	 
	
} 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值