数据结构(共享栈的实现)

1.定义

共享栈:两个栈共享同一片内存空间,两个栈从两边往中间增长。

目的:节省内存空间。

空栈判断:一号栈的栈顶指针为-1,二号栈的栈顶指针为MaxSize。

栈满判断:一号栈的栈顶指针位置等于二号栈的栈顶指针-1。

2.代码

(1)定义结构体

typedef struct{
	int data[MaxSize];//一个存放栈中数据元素的结构体 
	int top1;//指向一号栈栈顶的指针
	int top2;// 指向二号栈栈顶的指针
	int size1;//记录一号栈大小 
	int size2; //记录二号栈大小 
	int search;//遍历指针 
}SqStack;//定义栈的结构体 

(2)初始化栈

void InitStack(SqStack *S){//初始化 
	S->top1=-1;//1号栈的栈顶指针指向栈顶初始化位置 
	S->top2=MaxSize;//2号栈的栈顶指针指向栈尾初始位 
	S->size1 = 0;
	S->size2 = 0;
	S->search=-1;//遍历指针 
}

(3)入栈操作

bool Push(SqStack *S,int pushNum){//一号栈入栈 
	if(S->top1==S->top2-1){//栈满 
		return false;//入栈失败 
	}
	S->data[++S->top1]=pushNum;//入栈 
	S->size1++;//栈长+1 
	return true;
}
bool Push2(SqStack *S,int pushNum){//二号栈入栈 
	if(S->top1==S->top2-1){//栈满 
		return false;//入栈失败 
	}
	S->data[--S->top2]=pushNum;//入栈 
	S->size2++;//栈长+1 
	return true;
}

(4)读取栈顶

bool ReadTop(SqStack *S,int *readNum){//一号栈读取栈顶元素 
	if(S->size1==0){//一号栈中没有元素 
		return false;
	}
	*readNum = S->data[S->top1];
//	printf("栈顶元素是%d\n",readNum);
	return true;
}
bool ReadTop2(SqStack *S,int *readNum){//二号栈读取栈顶元素 
	if(S->size2==0){//二号栈中没有元素 
		return false;
	}
	*readNum = S->data[S->top2];
//	printf("栈顶元素是%d\n",readNum);
	return true;
}

(5)出栈操作

bool Pop(SqStack *S,int *popNum){//一号栈出栈操作 
	if(S->size1==0){//一号栈中没有元素 
		return false;
	}
	*popNum = S->data[S->top1--];//和读栈的区别在出栈将栈顶指针下移一位
	S->size1--;//计数-1 
	return true; 
}
bool Pop2(SqStack *S,int *popNum){//二号出栈操作 
	if(S->size2==0){//二号栈中没有元素 
		return false;
	}
	*popNum = S->data[S->top2++];//二号栈的栈顶指针和一号栈移动方向相反 
	S->size2--;//计数-1 
	return true; 
}

(6)遍历整个栈存储空间

void TraversalStack(SqStack S){
	int Traversal = S.search+1;
	int record = 0;
	while(Traversal<MaxSize){
		
		record = S.data[Traversal];
		printf("%d\n",record);
		Traversal++;
	}
	
}

 

3.整体代码

//共享栈 
#include <stdio.h>
#include <stdlib.h>

#define MaxSize 10//栈中元素的最大个数 
//   -1是栈顶指针的初始化位置  [0,1,2,3,4,5,6,7,8,9] 
typedef struct{
	int data[MaxSize];//一个存放栈中数据元素的结构体 
	int top1;//指向一号栈栈顶的指针
	int top2;// 指向二号栈栈顶的指针
	int size1;//记录一号栈大小 
	int size2; //记录二号栈大小 
	int search;//遍历指针 
}SqStack;//定义栈的结构体 

void InitStack(SqStack *S){//初始化 
	S->top1=-1;//1号栈的栈顶指针指向栈顶初始化位置 
	S->top2=MaxSize;//2号栈的栈顶指针指向栈尾初始位 
	S->size1 = 0;
	S->size2 = 0;
	S->search=-1;//遍历指针 
}
bool Push(SqStack *S,int pushNum){//一号栈入栈 
	if(S->top1==S->top2-1){//栈满 
		return false;//入栈失败 
	}
	S->data[++S->top1]=pushNum;//入栈 
	S->size1++;//栈长+1 
	return true;
}
bool Push2(SqStack *S,int pushNum){//二号栈入栈 
	if(S->top1==S->top2-1){//栈满 
		return false;//入栈失败 
	}
	S->data[--S->top2]=pushNum;//入栈 
	S->size2++;//栈长+1 
	return true;
}
bool ReadTop(SqStack *S,int *readNum){//一号栈读取栈顶元素 
	if(S->size1==0){//一号栈中没有元素 
		return false;
	}
	*readNum = S->data[S->top1];
//	printf("栈顶元素是%d\n",readNum);
	return true;
}
bool ReadTop2(SqStack *S,int *readNum){//二号栈读取栈顶元素 
	if(S->size2==0){//二号栈中没有元素 
		return false;
	}
	*readNum = S->data[S->top2];
//	printf("栈顶元素是%d\n",readNum);
	return true;
}

bool Pop(SqStack *S,int *popNum){//一号栈出栈操作 
	if(S->size1==0){//一号栈中没有元素 
		return false;
	}
	*popNum = S->data[S->top1--];//和读栈的区别在出栈将栈顶指针下移一位
	S->size1--;//计数-1 
	return true; 
}
bool Pop2(SqStack *S,int *popNum){//二号出栈操作 
	if(S->size2==0){//二号栈中没有元素 
		return false;
	}
	*popNum = S->data[S->top2++];//二号栈的栈顶指针和一号栈移动方向相反 
	S->size2--;//计数-1 
	return true; 
}

void TraversalStack(SqStack S){
	int Traversal = S.search+1;
	int record = 0;
	while(Traversal<MaxSize){
		
		record = S.data[Traversal];
		printf("%d\n",record);
		Traversal++;
	}
	
}

int main(){
	bool flag = true;
	SqStack S;//声明一个顺序栈
	InitStack(&S);//初始化 
	//选择操作哪个栈
	int electStack = 0;
	printf("请输入要操作的栈(1 or 2):");
	scanf("%d",&electStack);
	while(electStack == 1 || electStack==2){
		if(electStack == 1){//使用一号栈 
			//入栈 
		int pushNum = 0;//记录入栈元素的变量 
		printf("请向栈中输入元素(输入99结束):");
		scanf("%d",&pushNum);
		while(pushNum != 99){
			flag=Push(&S,pushNum);//入栈 
			if(flag){
				printf("\n请向栈中输入元素(输入99结束):");
				scanf("%d",&pushNum);
			}else{
				printf("入栈失败");
				exit(0);
			}
			
		}
		
		//读栈
		int readNum = 0;
		ReadTop(&S,&readNum);//读取栈顶元素
		printf("栈顶元素是%d\n",readNum);
		
		//出栈
		int popNum = 0;//存储出栈元素的变量 
		char elect = NULL;//判断是否继续出栈的变量 
		printf("是否出栈元素(y|x):");
		scanf("%s",&elect);
		while(elect == 'y'){
			flag = Pop(&S,&popNum);	//调用出栈操作 
			if(flag == false){
				printf("\n栈已空");
				exit(0);
			}else{
				printf("\n出栈元素为%d",popNum);
			}
			printf("\n是否出栈元素(y|x):");
			scanf("%s",&elect);
		}
		
		TraversalStack(S);//遍历共享表 
		printf("请输入要操作的栈(1 or 2):");
		scanf("%d",&electStack);
		}else if(electStack == 2){//使用二号栈 
					//入栈 
			int pushNum = 0;//记录入栈元素的变量 
			printf("请向栈中输入元素(输入99结束):");
			scanf("%d",&pushNum);
			while(pushNum != 99){
				flag=Push2(&S,pushNum);//入栈 
				if(flag){
					printf("\n请向栈中输入元素(输入99结束):");
					scanf("%d",&pushNum);
				}else{
					printf("入栈失败");
					exit(0);
				}
				
			}
			
			//读栈
			int readNum = 0;
			ReadTop2(&S,&readNum);//读取栈顶元素
			printf("栈顶元素是%d\n",readNum);
			
			//出栈
			int popNum = 0;//存储出栈元素的变量 
			char elect = NULL;//判断是否继续出栈的变量 
			printf("是否出栈元素(y|x):");
			scanf("%s",&elect);
			while(elect == 'y'){
				flag = Pop2(&S,&popNum);	//调用出栈操作 
				if(flag == false){
					printf("\n栈已空");
					exit(0);
				}else{
					printf("\n出栈元素为%d",popNum);
				}
				printf("\n是否出栈元素(y|x):");
				scanf("%s",&elect);
			}
			TraversalStack(S);//遍历共享表
			printf("请输入要操作的栈(1 or 2):");
			scanf("%d",&electStack);
				
		}
		
	} 
	
} 

共享是两个共享一个数组空间的数据结构,可以在数组的两端分别设置两个顶,实现两个的同时操作。以下是一个基于数组实现共享示例代码: ```c++ #include <iostream> using namespace std; const int MAXSIZE = 100; // 数组的最大容量 class SharedStack { private: int data[MAXSIZE]; // 数组空间 int top1; // 1的栈顶指针 int top2; // 2的栈顶指针 public: SharedStack() { // 初始栈顶指针 top1 = -1; top2 = MAXSIZE; } // 向1中压入元素 bool push1(int x) { if (top1 + 1 == top2) // 满,无法压 return false; data[++top1] = x; // 将元素压入1中 return true; } // 从1中弹出元素 bool pop1(int& x) { if (top1 == -1) // 空,无法弹出 return false; x = data[top1--]; // 将1的顶元素弹出 return true; } // 向2中压入元素 bool push2(int x) { if (top1 + 1 == top2) // 满,无法压 return false; data[--top2] = x; // 将元素压入2中 return true; } // 从2中弹出元素 bool pop2(int& x) { if (top2 == MAXSIZE) // 空,无法弹出 return false; x = data[top2++]; // 将2的顶元素弹出 return true; } }; int main() { SharedStack s; s.push1(3); s.push1(5); s.push2(6); s.push2(9); int x; s.pop1(x); // 从1中弹出元素 cout << "Pop from stack 1: " << x << endl; s.pop2(x); // 从2中弹出元素 cout << "Pop from stack 2: " << x << endl; return 0; } ``` 在上面的示例代码中,我们定义了一个 `SharedStack` 类来表示共享,其中使用了一个大小为 `MAXSIZE` 的数组 `data` 来存储元素,并定义了两个栈顶指针 `top1` 和 `top2` 来表示两个位置。当向1中压入元素时,我们将元素压入数组下标为 `top1+1` 的位置,并将 `top1` 加一;当从1中弹出元素时,我们将 `top1` 减一,并将数组下标为 `top1` 的元素弹出。对于2的操作也是类似的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值