课本笔记:用一个数组实现两个堆栈,要求最大地利用数组空间,只要有空间入栈操作就可以成功

以下是个人笔记
仅供参考哈
理解:
假设一个数组Data[6],分成两份,一份为堆栈1,另一份为堆栈2,分别从两段压入元素,朝向中间,这似乎可行

但,如果出现这样一边多,一边少的情况就不行了,因为无法充分利用空间
在这里插入图片描述

因此要想充分利用,必须消除红线,不断向中间存储,自到栈满为止

在这里插入图片描述
知道了这些,那么
下面开始打代码了
1.首先设置结构体,包含Top1(堆栈1的顶),Top2(堆栈2的顶),数组Data
2.再设置s为结构体变量,为其初始化

typedef struct SNode* Stack;//Stack代替struct SNode*
struct SNode {
    
    
	int Data[MaxSize];
	int Top1;//堆栈1的TOP 
	int Top2;//堆栈2的TOP 
};
struct SNode S = {
    
    
	{
    
    0},       //初始化 
	-1,        //堆栈1初始化 
	MaxSize    //堆栈2初始化 
};

3.在进行操作之前,有两个主要的方法需要实现,分别是push()方法和Pop方法:
(1)push方法目的是将数存储在栈中(压入),即存储在Data[MaxSize]中。
(2)Pop方法目的是将存储在栈中的数输出(弹出),即输出Data[MaxSize]中的数。

void Push(Stack PtrS, int item, int Tag)//压入
{
    
    /*Tag分别标记两个堆栈,取值为1或2*/
	if (PtrS->Top1 == PtrS->Top2) {
    
    
		printf("堆栈满"); return;
	}//以两Top相等为判断条件 
	if (Tag == 1) {
    
    
		PtrS->Data[++(PtrS->Top1)] = item;
	}//存储堆栈1 
	else {
    
    
		PtrS->Data[--(PtrS->Top2)] = item;
	}//存储堆栈2 
}

在出栈之前,我们需要检测是否为空

int Pop(Stack PtrS, int Tag)//弹出 
{
    
    
	if (Tag == 1) {
    
    
		if (PtrS->Top1 == -1) {
    
    
			printf("堆栈1空"); return -1; 
		}
		else {
    
    
			return PtrS->Data[(PtrS->Top1)--];
		}//返回Top对应数组的数字并减一 
	}
	else {
    
    
		if (PtrS->Top2 == MaxSize) {
    
    
			printf("堆栈2空"); return -1;
		}
		else {
    
    
			return PtrS->Data[(PtrS->Top2)++];
		}//返回Top对应数组的数字并加一 
	}
}

以下是完整代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MaxSize 5 //存储元素最大个数 

typedef struct SNode* Stack;//Stack代替struct SNode*
struct SNode {
    
    
	int Data[MaxSize];
	int Top1;//堆栈1的TOP 
	int Top2;//堆栈2的TOP 
};
struct SNode S = {
    
    
	{
    
    0},       //初始化 
	-1,        //初始化 
	MaxSize    //初始化 
};
Stack PtrS;
//S.Top1 = -1;
//S.Top2 = MaxSize; 

void Push(Stack PtrS, int item, int Tag)//压入
{
    
    /*Tag分别标记两个堆栈,取值为1或2*/
	if (PtrS->Top1 == PtrS->Top2) {
    
    
		printf("堆栈满"); return;
	}//以两Top相等为判断条件 
	if (Tag == 1) {
    
    
		PtrS->Data[++(PtrS->Top1)] = item;
	}//存储堆栈1 
	else {
    
    
		PtrS->Data[--(PtrS->Top2)] = item;
	}//存储堆栈2 
}
int Pop(Stack PtrS, int Tag)//弹出 
{
    
    
	if (Tag == 1) {
    
    
		if (PtrS->Top1 == -1) {
    
    
			printf("堆栈1空"); return -1; 
		}
		else {
    
    
			return PtrS->Data[(PtrS->Top1)--];
		}//返回Top对应数组的数字并减一 
	}
	else {
    
    
		if (PtrS->Top2 == MaxSize) {
    
    
			printf("堆栈2空"); return -1;
		}
		else {
    
    
			return PtrS->Data[(PtrS->Top2)++];
		}//返回Top对应数组的数字并加一 
	}
}
int main()
{
    
    
	int item, Tag, i;
	PtrS = &S;

	for (i = 0; i < MaxSize; i++)//压入操作 
	{
    
    
		printf("请输入您要选择存储的堆栈(选择:1或2):\t");
		scanf("%d", &Tag);
		printf("请输入您要选择存储的数:\t");
		scanf("%d", &item);
		Push(PtrS, item, Tag);
	}
	printf("\n");
	printf("请选择是否释放所存储的数?(选择:yes或no)\t");
	char sum[4];
	int Qr;
	scanf("%s", sum);
	if (strcmp(sum, "yes") == 0) {
    
    
		for( ; ; ){
    
     
		    printf("请输入您要选择释放的堆栈(选择:1或2):\t");
		    scanf("%d", &Tag);
			printf("请确认您是否选择此次释放:(1表示确认,2表示不确认,3表示退出)\t");
			scanf("%d",&Qr);
			if(Qr==1){
    
    
				    int pop = Pop(PtrS, Tag);
					if(pop!=-1) 
					printf("释放数:%d\n", pop);
					else
					printf(" \n");
			}
		    else if(Qr==2){
    
    
    			printf("\n"); 
    		} 
    		else if(Qr==3){
    
    
		    	exit(1);
		    }
		    else{
    
    
    			printf("ERROR!!!");
    		}
		}
		
	}
	else if (strcmp(sum, "no") == 0) {
    
    
		printf("\n");
	}
	else {
    
    
		printf("ERROR!!!\n");exit(1);
	}
	return 0; 
}

猜你喜欢

转载自blog.csdn.net/qq_52001969/article/details/112743090