Arithmetic第四篇:顺序栈的创建及基本操作

一、什么是栈?
    答:栈是限制在表的一端进行插入和删除的线性表(栈的插入和删除限定在表尾)。在线性表中进行插入、删除操作的一端成为栈顶(Top),栈顶保存的元素成为栈顶元素。相对而言,表的另一端成为栈底(Botton)。当栈中没有数据元素的时候成为空栈。
举例说明:栈就像手枪里面的子弹一样,有顺序存储,只能从一端进行更换;
在这里插入图片描述
二、栈的性质
    答:由于栈的插入和删除仅在栈顶进行,后进栈的元素必定先出栈,所以又把栈成为后进先出表或先进后出表。
在这里插入图片描述
三、栈的存储方式分类
    答:和前面所学的线性表相似,分为顺序栈和链栈。这里我们主要讲顺序栈。
四、栈的抽象数据类型定义
在这里插入图片描述五、顺序栈入栈思想
(一)先判断栈是否已满,若没满,则可继续进行入栈操作,否则结束;
(二)栈顶指针先自增,给需要进栈的元素留出存储空间;
(三)将要入栈的元素放入存储空间。
                        栈顶指针和栈中元素之间的关系
在这里插入图片描述
   1.空栈中的栈顶指针的指向和栈底指针一致
   2.非空栈中的栈顶指针始终在栈顶元素的下一个位置

六、入栈代码实现

//判断顺序栈是否为空 
int EMPTY(seqstack *s) {  
	if(s->top>=0)   return 0; 
	else return 1;
} 
//进栈
seqstack *PUSH(seqstack *s) { 
	int x; 
	printf("你想要插入的数字:"); 
	scanf("%d",&x); 
	if(s->top==maxsize-1) {  
		printf("overflow");  
		return NULL;  
	}else{
		s->top++;
		s->data[s->top] = x;
	}
	return s;
}

七、出栈操作思想
(一)先判断栈中是否有元素,如果有元素才能出栈,否则结束操作;
(二)将要出栈的元素取出来放在存储空间中;
(三)栈顶指针自减。
八、出栈代码实现

//输出栈
void print(seqstack *s){
	int i;
	if(s->top<0){
		printf("清空栈成功");
	}
	for(i=s->top;i>=0;i--){
		printf("%d\n",s->data[i]);
	}
}

九、完整代码实现

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
//定义符号变量
#define maxsize 64
//定义数据元素类型
typedef int datatype; 
//定义结构体
typedef struct{
	datatype data[maxsize];
	int top;
}seqstack;
//建立顺序栈
seqstack *SET(seqstack *s){
	int i; 
	s=(seqstack*)malloc(sizeof(seqstack)); 
	s->top=-1; 
	printf("请输入顺序栈元素(输入0的时候结束):"); 
	scanf("%d",&i); 
	do{ 
     s->top++; 
	 s->data[s->top]=i; 
	 scanf("%d",&i); 
	}while(i!=0); 
	printf("顺序栈建立成功\n"); 
	return s; 
} 
//清空顺序栈
void SETNULL(seqstack *s) {  
	s->top=-1;
} 
//判断顺序栈是否为空 
int EMPTY(seqstack *s) {  
	if(s->top>=0)   return 0; 
	else return 1;
} 
//进栈
seqstack *PUSH(seqstack *s) { 
	int x; 
	printf("你想要插入的数字:"); 
	scanf("%d",&x); 
	if(s->top==maxsize-1) {  
		printf("overflow");  
		return NULL;  
	}else{
		s->top++;
		s->data[s->top] = x;
	}
	return s;
}
//退栈
seqstack *POP(seqstack *s) { 
	if(s->top<0){
		printf("underlow");
		return s;
	}else{
	
		s->top--;
		printf("删除的栈顶元素是:");
		printf("%d\n",(s->data[s->top+1]));
	}
	return s;
}
//取栈顶
void TOP(seqstack *s){

	if(s->top<0){
		printf("stack is empty");
	}else{
		printf("当前的栈顶元素是:");
		printf("%d\n",(s->data[s->top]));
	}
}
//输出栈
void print(seqstack *s){
	int i;
	if(s->top<0){
		printf("清空栈成功");
	}
	for(i=s->top;i>=0;i--){
		printf("%d\n",s->data[i]);
	}
}
//主函数
int main(){
	seqstack *s;
	int i,j;
	printf("\n        欢迎使用\n");
	printf("--------------------------\n");
	printf("1.建立一个顺序栈\n");
	printf("2.输出栈\n");
	printf("3.进栈\n");
	printf("4.退栈\n");
	printf("5.取栈顶元素\n");
	printf("6.清空栈\n");
	printf("7.判断栈是否为空\n");
	printf("8.结束程序\n");
	printf("---------------------------\n");
	do{
		printf("请选择想要实现的功能\n");
		scanf("%d",&i);
		switch(i){
			case 1:s=SET(s);break;
			case 2:print(s);printf("\n");break;
			case 3:s=PUSH(s);print(s);printf("\n");break;
			case 4:s=POP(s);print(s);printf("\n");break;
			case 5:TOP(s);break;
			case 6:SETNULL(s);print(s);printf("\n");break;
			case 7:j=EMPTY(s);if(j==1){printf("空栈\n");}else{printf("非空栈");}break;
			default:printf("-----------------谢谢您的使用----------\n");
			exit(12);
		}
	}while(1);
	return 0;
}

觉得不错的话加个关注呗

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值