(c语言)堆栈的双向生长(包含测试用例)

本实验取材于浙江大学《数据结构》,很多人都说堆栈的先进后出和队列的先进先出让人搞糊涂,但是只要认真理解,还是能看懂一丢丢的!加油实践

//堆栈的两个方向生长的源码
#include<stdio.h>
#include<stdlib.h>
#define false -1
#define ERROR -1
#define true 1
#define MaxSize1 10
typedef int Position;
typedef int ElementType;
typedef int Boolean;
typedef struct SNode *PtrToSnode;
struct SNode{
	ElementType *Data;//存储元素的数组
	Position Top1; //堆栈1的栈顶指针
	Position Top2; //堆栈2的栈顶指针
	int MaxSize; //堆栈最大容量
};
typedef PtrToSnode Stack;
Boolean Push(Stack S,ElementType X,int Tag)
{
	if(S->Top2-S->Top1==1)//堆栈满了
	{
		printf("Stack is full\n");
		return false;
	}
	else{
		if(Tag==1){
			S->Data[++(S->Top1)]=X;//对第一个堆栈操作
		}else{
			S->Data[--(S->Top2)]=X;//对第二个堆栈操作
		}
		return true;
	}
}
ElementType Pop(Stack S,int Tag)
{
	//Tag作为区分两个堆栈的标志,取值为1和2
	if(Tag==1){
		//对第一个堆栈进行操作
		if(S->Top1==-1){
			printf("Stack1 is Empty\n");
			return ERROR;
			
		}else
			return S->Data[(S->Top1)--];
	}else{
		//对第二个堆栈进行操作
		if(S->Top2==S->MaxSize){
			printf("Stack2 is Empty\n");
			return ERROR;
			
		}else
			return S->Data[(S->Top2)++];		
	}
	
}
int main()
{
	Stack S  = (Stack)malloc(sizeof(struct SNode));
	S->Data = (ElementType *)malloc(MaxSize1*sizeof(ElementType));
	S->Top1=-1;
	S->Top2=MaxSize1;
	S->MaxSize = MaxSize1;
	int Tag = Push(S,1,1);
	Tag = Push(S,2,1);
	Tag = Push(S,3,1);
	Tag = Push(S,4,1);
	Tag = Push(S,5,1);
	Tag = Push(S,1,2);
	Tag = Push(S,2,2);
	Tag = Push(S,3,2);
	Tag = Push(S,4,2);
	Tag = Push(S,5,2);
	printf("Stack1 pop :%d,Stack2 pop :%d ",Pop(S,1),Pop(S,2));
	return 0;
	//堆栈特点:先进后出
	//测试用例堆栈用例:堆栈1 1 2 3 4 5 堆栈2 1 2 3 4 5
	//弹出的时候都弹出5,才算程序正常
}

堆栈最著名的还是压入和弹出,在堆栈的双向生长中,什么是压入呢,首先看你要压入哪里
在这里插入图片描述
Top2是指向Maxsize也就是数组的尾部,Top是-1也是数组的头部,双向生长就是一个数组对半分,同时往中间进行压栈,当Top1与Top2相差一个1时,也就是相遇了,那就说明堆栈满了,跳出来哟,不然就是压入堆栈1,Top++,压入堆栈2,Top–,压入堆栈.
弹出数据呢,同理,判断是否为空,什么是空,也就是Top2指向数组尾部,Top1指向-1.也就是为空了,这样肯定是空的。堆栈1弹出,Top1–,堆栈2弹出Top2++.

发布了63 篇原创文章 · 获赞 2 · 访问量 1450

猜你喜欢

转载自blog.csdn.net/m0_37149062/article/details/105065106
今日推荐