以下是个人笔记
仅供参考哈
理解:
假设一个数组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;
}