数据结构上机-栈的实现

1.数据结构学习模式

学习一种数据结构时,总是从下述三个方面展开:

(1)逻辑结构:是从逻辑关系上描述数据,可看作上从具体问题中抽象出来的数据模型,

与计算机存储无关。

(2)存储结构:是逻辑结构在存储器中的实现。

(3)数据操作:是定义在数据逻辑结构上的一组运算。

2.栈知识总结

栈的操作特点是“先进后出”,可以想象成是一个往里面装物品的容器,插入和删除都在同一端,称为“栈顶”,另一端不能操作,称为“栈底”。栈最常用的操作是入栈(输入数据),出栈(输出数据)。

实现效果如图

 实现代码如下

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 3

typedef struct             
{
	int array[MAXSIZE];  
	int stacksize;  
	int *base,*top;			   
}SqStack;		  

void printStar()	//连续输入几十个*,用来设计虚拟界面的边框
{
	int i;
	for(i=0;i<70;i++)
		printf("*");
	printf("\n");
}

void menu()			//因为C语言无法创建可视化界面,因此这里创建一个虚拟的界面,方便用户操作
{
	printStar();
	printf("\t\t\t欢迎进入顺序栈操作界面!\n");
	printf("请从键盘输入数字,完成对应的操作(1到7为有效操作,输入其他退出程序)\n");	
	printf("\t 1.初始化顺序栈\n");
	printf("\t 2.判断栈是否为空\n");
	printf("\t 3.判断栈是否为满\n");
	printf("\t 4.入栈\n");
	printf("\t 5.出栈\n");
	printf("\t 6.取栈顶元素\n");
	printf("\t 7.输出该顺序栈\n");
	printStar();
}

void InitStack(SqStack *S){
	//<------将此处代码补充完整
	int *q;
	q = &S->array[0];
	S->base = S->top = q;
	S->stacksize = 0; 
		printf("顺序栈初始化成功!\n");
}

void StackEmpty(SqStack *S)
{
	if(S->base == S->top){
		printf("顺序栈为空\n");
	}
   else printf("顺序栈不为空\n");
}

void StackFull(SqStack *S)
{
	if(S->top-S->base == MAXSIZE){
		printf("顺序栈为满\n");
	}
   else printf("顺序栈不为满\n");
}

void Push(SqStack *S,int n){
	printf("请输入要入栈的元素: \n");
	scanf("%d", &n);	
	if(S->top - S->base == MAXSIZE){
		printf("顺序栈为满!请出栈后再入栈\n");
	}
	else{
		//<------将此处代码补充完整
		S->array[S->stacksize] = n;
		S->stacksize++;
		S->top++;
		printf("入栈完毕\n");
	}
}

void Pop(SqStack *S){
	int x;
	if(S->base == S->top){
		printf("顺序栈为空!请入栈后再出栈\n");
	}
	else{
		//<------将此处代码补充完整
		x= S->array[S->stacksize-1];
		S->stacksize--;
		S->top--;
		printf("出栈元素为:%d\n",x);
	}
}

void GetTop(SqStack *S){
	int x;
	if(S->base == S->top){
		printf("顺序栈为空!请入栈后再取栈顶元素\n");
	}
	else{
		//<------将此处代码补充完整
		x= S->array[S->stacksize-1];
		S->stacksize--;
		S->top--;
		printf("栈顶元素为:%d\n",x);
	}
}

void Output(SqStack *S){
	int i;
	if(S->base == S->top){
		printf("顺序栈为空!\n");
	}
	else{
		printf("输出顺序栈:");
		for(i=0;i<S->stacksize;i++){
			printf("%d ",S->array[i]);
		}
		}
}


void main(){
	SqStack S;
	int select,n,x,flag=1;
	menu();
	while(flag==1){
		printf("您选择的操作是:");
		fflush(stdin);
		scanf("%d",&select);
		switch(select){		
			case 1:	InitStack(&S);
					printf("\n");
					break;
			case 2:	StackEmpty(&S);
					printf("\n");
					break;
			case 3:	StackFull(&S);
					printf("\n");
					break;
			case 4:	Push(&S,n);
					printf("\n");
					break;
			case 5:	Pop(&S);
					printf("\n");
					break;
			case 6:	GetTop(&S);
					printf("\n");
					break;	
			case 7:	Output(&S);
					printf("\n");
					break;
				
			//<------将此处代码补充完整
			default:printf("您选择退出程序,欢迎下次光临!\n");
					flag = 0;
		}
	}
	printf("\n");
	system("pause");
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值