栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

栈的顺序存储实现----用一个数组实现两个堆栈(浙)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

栈的顺序存储实现----用一个数组实现两个堆栈(浙)

#include 
#include 
#include 
#define MaxSizeArray 16//该程序的缺陷之处:调用CreateStack(int MaxSize)函数时,需与MaxSize保持一致(重在理解堆栈,哈哈) 

//用一个数组实现两个堆栈 
typedef struct DStack *Stack;
typedef int Position; 
struct DStack {
	int *Data;//存储元素的数组 
	Position Top1;//堆栈1的顶部指针 
	Position Top2;//堆栈2的顶部指针,也可以说是堆栈的最大容量 
	 
};

//创建一个空的堆栈 
Stack CreateStack(int MaxSize) {
	//为所创造的DStack栈分配内存
	Stack S = (Stack)malloc(sizeof(struct DStack));
	//为数组分配内存
	S->Data = (int *)malloc(MaxSize * sizeof(int));
	
	S->Top1 = -1;
	S->Top2 = MaxSize;
	return S;  
}
 
//判断栈是否为空
bool IsEmpty(Stack PtrS) {
	return PtrS->Top1 == -1;
} 

//判断栈是否为空 
bool IsFull(Stack PtrS) {
	 return PtrS->Top2 - PtrS->Top1 == 1;	
} 

//push操作
void Push(Stack PtrS, int item, int Tag) {
	if(IsFull(PtrS)) {
		printf("堆栈满");
		return; 
	}
	if (Tag == 1) //对第一个栈进行操作
	   PtrS->Data[++(PtrS->Top1)] = item;
	else//对第二个栈进行操作 
		PtrS->Data[--(PtrS->Top2)] = item;
} 

//pop操作
int Pop(Stack PtrS,int Tag) {
	if (Tag == 1) {//对同一个数组中的其中一个堆栈1进行操作 
		if(IsEmpty(PtrS)) {
			printf("堆栈1空");
			return NULL; 
		} else {
			return PtrS->Data[(PtrS->Top1)--];
		}
  		  	   
	} else {
		if(PtrS->Top2 == MaxSizeArray) {//对同一个数组中的其中一个堆栈2进行操作 
			printf("堆栈2空");
			return NULL;	 
		} else {
			return PtrS->Data[(PtrS->Top2)++];
		}
	}
	
} 

//编写一个测试函数
 
void ShowStack(Stack S,int tag) {
	Position temp;
	if(tag == 1) {
		temp = S->Top1;
		for(int i = temp; i >= 0; i--) {
			printf("下标为%d的值为:%dn",i,S->Data[i]);
		}
	} else {
		temp = S->Top2;
		for(int i = temp; i < MaxSizeArray; i++) {
			printf("下标为%d的值为:%dn",i,S->Data[i]);
		}
	}	
}
int main(void) {
	Stack S = CreateStack(16);
	
	//对堆栈1进行操作 
	Push(S,1,1);
	Push(S,2,1);
	Push(S,3,1);
	Push(S,4,1);
	
	//对堆栈2进行操作 
	Push(S,16,2);
	Push(S,15,2);
	Push(S,14,2);
	Push(S,13,2);
	
//	StackTest(Stack S,int tag)---显示堆栈

//push--test
    printf("pop--test");
	printf("堆栈1为:n"); 
 	ShowStack(S,1);
 	printf("n堆栈2为:n");  
 	ShowStack(S,2);
 	
//pop--test
    printf("npop--testn");
	Pop(S,1);//将下标为3所在元素Pop出去
	ShowStack(S,1);	   
	Pop(S,1);//将下标为2所在元素Pop出去	   
	Pop(S,1);//将下标为1所在元素Pop出去
	
	printf("n只剩一个元素,将其显示n"); 
	ShowStack(S,1);	   
	Pop(S,1);//将下标为0所在元素Pop出去	   
 	ShowStack(S,1);
 	printf("n报堆栈1空的提示n"); 
 	Pop(S,1);//堆栈1中没有元素,报--堆栈1空--的提示
	 		   
	return 0;
}

 

测试结果:

pop--test堆栈1为:
下标为3的值为:4
下标为2的值为:3
下标为1的值为:2
下标为0的值为:1

堆栈2为:
下标为12的值为:13
下标为13的值为:14
下标为14的值为:15
下标为15的值为:16

pop--test
下标为2的值为:3
下标为1的值为:2
下标为0的值为:1

只剩一个元素,将其显示
下标为0的值为:1

报堆栈1空的提示
堆栈1空
--------------------------------
Process exited after 0.0282 seconds with return value 0
请按任意键继续. . .
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/528931.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号