双栈的实现

/*	两顺序栈共享一个地址连续的存储单元,一个栈的栈底为起始位置
	一个栈的栈底为末尾,压入数据时从两边向中间推进,如果指示栈
	顶的指针top1 + 1 等于另一个栈顶的指针top2时两栈已满,
	如果top1 == -1,top2 == MAXSIZE两栈为空					*/

#ifndef DOUBLESTACK_H
#define DOUBLESTACK_H
#define INFINITY 65535  //β值表标无限大
#define MAXSIZE 1000  //存储单元的最大值
typedef int ElemType; //栈的数据类型
typedef struct {
	ElemType data[MAXSIZE];  //存储单元
	int top1;
	int top2;
}DoubleStack;

void InitStack(DoubleStack *s); //初始化两个栈

void Push(DoubleStack *s,int i,ElemType e); //将数据e压栈,参数i为栈的序号1或2

ElemType Top(DoubleStack *s,int i); //参数i为栈的序号,返回栈顶的元素

ElemType Pop(DoubleStack *s,int i); //参数i为栈的序号,返回并删除栈顶的元素

bool IsEmpty(DoubleStack *s);  //判断栈是否为空

void Clear(DoubleStack *s);		//清空两栈

void Print(DoubleStack *s,int i); //打印栈底到栈顶的数据,i为栈的序号
#endif //DOUBLESTACK_H


 

#include "DoubleStack.h"
#include <stdio.h>
void InitStack(DoubleStack *s)  //初始化两栈
{
	s->top1 = -1;
	s->top2 = MAXSIZE;
}
void Push(DoubleStack *s,int i,ElemType e) //将数据元素e压栈,i为栈的序号
{
	if(i == 1)
	{
		if(s->top1 + 1 == s->top2)
			return;
		s->data[++s->top1] = e;
	}
	else if(i == 2)
	{
		if(s->top2 - 1 == s->top1)
			return;
		s->data[--s->top2] = e;
	}
}

ElemType Top(DoubleStack *s,int i) //i为栈的序号,返回栈顶的元素
{
	if(i == 1)
	{
		if(s->top1 == -1)
			return INFINITY;
		return s->data[s->top1];
	}
	else if(i == 2)
	{
		if(s->top2 == MAXSIZE)
			return INFINITY;
		return s->data[s->top2];
	}
}

ElemType Pop(DoubleStack *s,int i) //i为栈的序号,返回并删除栈顶的元素
{
	if(i == 1)
	{
		if(s->top1 == -1)
			return INFINITY;
		return s->data[s->top1--];
	}
	else if(i == 2)
	{
		if(s->top2 == MAXSIZE)
			return INFINITY;
		return s->data[s->top2++];
	}
}

bool IsEmpty(DoubleStack *s) //判断栈是否为空
{
	if(s->top1 == -1 && s->top2 == MAXSIZE)
		return true;
	return false;
}

void Clear(DoubleStack *s) //清空栈
{
	s->top1 = -1;
	s->top2 = MAXSIZE;
}
void Print(DoubleStack *s,int i) //打印栈底到栈顶的元素,i为栈的序列
{
	if(i == 1)
	{
		for(int j = 0;j <= s->top1;++j)
			printf("%d ",s->data[j]);
		printf("\n");
	}
	else if(i == 2)
	{
		for(int j = MAXSIZE - 1;j >= s->top2;--j)
			printf("%d ",s->data[j]);
		printf("\n");
	}
}


 

 

#include "DoubleStack.h"
#include <stdio.h>
int main()
{
	DoubleStack s;
	InitStack(&s);
	int k,i;
	printf("请输入要压入的栈的序号(1或2)及元素:\n");
	while((scanf("%d%d",&i,&k)) != EOF)
	{
		Push(&s,i,k);
		fflush(stdin);
	}
	Print(&s,1);
	Print(&s,2);
	int top1 = Top(&s,1);
	printf("第一个栈顶的元素:%d\n",top1);
	int top2 = Top(&s,2);
	printf("第二个栈顶的元素:%d\n",top2);
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值