数据结构(C语言版)——顺序栈(代码版)

一、代码

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10
#define OK 1
#define ERROR 0;

typedef int Status;
typedef struct stackStruct{
	int data[MAXSIZE];
	int top;
} Stack;
typedef struct stackStruct* STACK;

void PleaseInit(void);
int printMenu(void);
Status initStack(STACK* doublePointers);
Status insertStack(STACK* doublePointers,int SIZE);
Status printElementNumber(const STACK* doublePointers);
Status returnStackTop(const STACK* doublePointers);
Status destroyStack(STACK* doublePointers);
Status stackEmpty(const STACK* doublePointers);
Status clearStack(STACK* doublePointers);
Status pop(STACK* doublePointers);
 
int main(int argc, char *argv[]) {
	int menuChoice;
	STACK pointer=NULL;//创建指向该结构类型的指针 

	while(menuChoice=printMenu())
		{
				switch(menuChoice)
				{
					case 1:
					   initStack(&pointer);
						break;
					case 2:
						destroyStack(&pointer);
						break;
					case 3:
						clearStack(&pointer);
						break;
					case 4:
					   	stackEmpty(&pointer);
						break;
					case 5:
						returnStackTop(&pointer);
						break;
					case 6:
						insertStack(&pointer,MAXSIZE);
						break;
					case 7:
						pop(&pointer);
						break;
					case 8:
						printElementNumber(&pointer);
						break;
				}
		}
	return 0;
}

//打印菜单
int printMenu(void)
{
	int choice;
	
	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("按下0退出程序\n"); 
	printf("*******************************************\n");
	printf("请选择:");
	scanf("%d",&choice);
	return choice;
}

//1:初始化顺序栈
Status initStack(STACK* doublePointers)
{
	system("cls");//清屏  
    printf("当前选的为--1:初始化顺序栈--\n");
    
    if((*doublePointers)!=NULL)
    {
    	printf("请勿重复操作\n");
    	return ERROR;
	}
    *doublePointers=(STACK)malloc(sizeof(Stack));
	if((*doublePointers)==NULL)
	{
		printf("初始化失败\n");
		return ERROR;
	}
	(*doublePointers)->top=0;//top指向栈底 
	printf("初始化成功!\n");
	//printf("分配的地址为:%p",*doublePointers); 
	return OK; 
}

//2:销毁栈
Status destroyStack(STACK* doublePointers)
{
	system("cls");//清屏  
    printf("当前选的为--2:销毁栈--\n");
    
    char inputChar;
	if((*doublePointers)==NULL)
	{
		PleaseInit();
		return ERROR;
	}
	printf("是否销毁栈?(Y/N)");
	scanf(" %c",&inputChar);
	if(inputChar=='Y'||inputChar=='y')
	{
		//printf("清除的分配地址为:%p",*doublePointers); 
		free((*doublePointers));
		(*doublePointers)=NULL;
		printf("销毁成功!\n");
	}
	fflush(stdin);
	return OK;
}

//3:清空栈
Status clearStack(STACK* doublePointers)
{
	system("cls");//清屏  
    printf("当前选的为--3:清空栈--\n");
    
    char inputChar;
	if((*doublePointers)==NULL)
	{
		PleaseInit();
		return ERROR;
	}
	if((*doublePointers)->top==0)
	{
		printf("请先输入一些元素吧\n");
		return OK;
	}
	printf("是否清空栈?(Y/N)");
	scanf(" %c",&inputChar);
	if(inputChar=='Y'||inputChar=='y')
	{
		(*doublePointers)->top=0;
		printf("清空成功!\n");
	}
	fflush(stdin);
	return OK;
}

//4:栈是否为空
Status stackEmpty(const STACK* doublePointers)
{
	system("cls");//清屏  
    printf("当前选的为--4:栈是否为空--\n");
    
	if((*doublePointers)==NULL)
	{
		PleaseInit();
		return ERROR;
	}
	if((*doublePointers)->top==0)
	{
		printf("当前栈为空栈\n");
		return OK;
	}
	printf("当前栈为不空栈\n");
	return OK;	
}
 
//5:返回栈顶元素
Status returnStackTop(const STACK* doublePointers)
{
	system("cls");//清屏  
    printf("当前选的为--5:返回栈顶元素--\n");
    
	if((*doublePointers)==NULL)
	{
		PleaseInit();
		return ERROR;
	}
	if((*doublePointers)->top==0)
	{
		printf("请先输入一些元素吧\n");
		return ERROR;
	}
	printf("当前栈顶元素为:%d\n",(*doublePointers)->data[(*doublePointers)->top-1]);	
 	return OK;
}
 
//6:插入元素到栈中 
Status insertStack(STACK* doublePointers,int SIZE)
{
	system("cls");//清屏  
    printf("当前选的为--6:插入元素到栈中--\n");
    
	if((*doublePointers)==NULL)
	{
		PleaseInit();
		return ERROR;
	}
	int inputNumber,i,inputValue,leavingsPosition;
	leavingsPosition=SIZE-((*doublePointers)->top);
	printf("当前有%d个空闲位置,请输入要插入的元素个数:",leavingsPosition);
	scanf("%d",&inputNumber);
	if(inputNumber<1||inputNumber>leavingsPosition)
	{
		printf("操作失败,超长范围\n");
		return ERROR;
	}
	printf("请输入要插入的元素:");
	for(i=1;i<=inputNumber;i++)
	{
	   scanf("%d",&inputValue);
	   if((*doublePointers)->top>SIZE)
	   {
	   	printf("操作失败\n");
		return ERROR; 
	   }
	   (*doublePointers)->data[(*doublePointers)->top]=inputValue;
	   (*doublePointers)->top++;
	}
	fflush(stdin);//清除输入缓冲区,防止输入的数值过多 
	printf("入栈成功!\n");
	return OK;
}

//7:删除栈顶元素,并返回
Status pop(STACK* doublePointers)
{
	system("cls");//清屏  
    printf("当前选的为--7:删除栈顶元素,并返回--\n");
    
	if((*doublePointers)==NULL)
	{
		PleaseInit();
		return ERROR;
	}
	if((*doublePointers)->top==0)
	{
		printf("请先输入一些元素吧\n");
		return ERROR;
	}
	printf("当前栈顶元素为:%d\n",(*doublePointers)->data[((*doublePointers)->top)-1]);
	(*doublePointers)->top--;
	printf("删除成功!\n");
	return OK;
}

//8:当前栈元素个数
Status printElementNumber(const STACK* doublePointers)
{
	system("cls");//清屏  
    printf("当前选的为--8:当前栈元素个数--\n");
    
	if((*doublePointers)==NULL)
	{
		PleaseInit();
		return ERROR;
	}
	printf("当前栈元素个数为:%d\n",(*doublePointers)->top);
	return OK;
} 
//请先初始化样式
void PleaseInit(void)
{
		printf("**************\n");
		printf("*请先初始化  *\n");
		printf("**************\n\n");
}  

二、代码中重要的函数或语句

①:初始化栈
 *doublePointers=(STACK)malloc(sizeof(Stack));
 (*doublePointers)->top=0;

解释:在内存中分配Stack类型的空间,并且*doublePointers指向这个内存地址。
如果分配不成功,malloc返回NULL值。所以在代码中会出现下面的判断

	if((*doublePointers)==NULL)
	{
		printf("初始化失败\n");
		return ERROR;
	}

这里需要注意的就是*doublePointers,要养成外面加括号的习惯(优先级问题)。
空间分配成功的话,我们就把top=0,表示top指向栈底。

初始化的最终效果如下图
在这里插入图片描述
在初始化中还有下面代码,是用来检查是否重复初始化

 if((*doublePointers)!=NULL)
    {
    	printf("请勿重复操作\n");
    	return ERROR;
	}

②:重要语句1

(一)、

typedef struct stackStruct{
	int data[MAXSIZE];
	int top;
} Stack;
typedef struct stackStruct* STACK;

上面定义了一个栈结构,并重新定义名为Stack,并且还定义了一个STACK。
(二)、

STACK pointer=NULL;//创建指向该结构类型的指针 

声明一个指向结构的指针变量。因为刚开始没有指向,所以一定要设为NULL。它在以后可以用来判断是否栈是否初始化

fflush(stdin);

该函数用于清空,输入缓冲区。防止当输入多输入时,对后面的操作有影响。
(三)、

initStack(&pointer);
initStack(STACK* doublePointers)

上面代码就是传递指针参数。效果如下图
在这里插入图片描述

③:插入元素到栈中

leavingsPosition=SIZE-((*doublePointers)->top);
 (*doublePointers)->data[(*doublePointers)->top]=inputValue;//
(*doublePointers)->top++;

leavingsPosition是用来存储剩余空间的变量。
接下来的两个语句一个是把元素压入栈中,另一个是top+1。是栈顶上移
如下图
在这里插入图片描述
(原始图)
在这里插入图片描述
(元素进栈)

④:删除栈顶元素,并返回

printf("当前栈顶元素为:%d\n",(*doublePointers)->data[((*doublePointers)->top)-1]);
	(*doublePointers)->top--;

当前第一条语句是把栈顶元素打印,然后top指针下移。

⑤:销毁栈

free((*doublePointers));
(*doublePointers)=NULL;

上面两句代码用下图来说明
在这里插入图片描述
(原始图),没执行代码前pointer指针,doublepointer,栈(绿色框代表地址)都在。执行完如下图
在这里插入图片描述
(执行后)

三、运行截图

①:初始化栈,并在栈中插入1,2,3,4。4个元素,并显示栈顶元素和当前栈元素个数
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
②:在上一步的基础上先删除栈顶元素,并返回,在判断栈是否为空,最后清空栈

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
③:在上一步基础上,判断空栈是否可以初始化,可否判断是否为空栈,可否删除栈顶元素,并返回,可否返回栈顶元素
在这里插入图片描述
发现不能初始化
在这里插入图片描述
发现可以判断,并给出提示
在这里插入图片描述
发现不可以删除栈顶(因为没有元素)
在这里插入图片描述
发现不能
④:销毁栈,并随意进行除初始化栈之外的其他操作
在这里插入图片描述
在这里插入图片描述
重复销毁时给出提示
在这里插入图片描述
同样清空栈是也给出提示

如有错误欢迎指出
本篇博客源代码和文件已经上传,欢迎下载

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kinghiee

爸爸们求打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值