顺序表示的栈——顺序栈3——共享栈

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_36669549/article/details/84324569

在使用顺序栈时,定义空间过大,可能造成有些栈空闲,空间并没有有效利用。为了使栈的空间能充分利用,可以让多个栈共享一个足够大的连续存储空间,通过移动栈顶指针,从而使多个栈空间互相补充,存储空间得到有效利用,这就是共享栈的设计思想。
 

最常见的是两个栈的共享。栈的共享原理是利用栈低固定,栈顶迎面增长的方式。可通过两个栈共享一个一维数组实现,两个栈的栈低设置在数组的两端,当有元素进栈时,栈顶位置从栈的两端迎面增长,当两个栈的栈顶相遇时,栈满。
用一维数组表示的共享栈如图。

有两个栈S1和S2都采用顺序结构存储,并且共享一个存储区。为了尽可能利用存储空间,减少溢出的可能,采用栈顶相向,迎面增长的方式,试设计S1和S2有关入栈和出栈的算法。

这是哈工大的考研试题,主要考察共享栈的算法设计。

【存储结构】

typedef strcut
{
      DataType stack[StackSize];
      int top[2];
}SSeqStack;

SSeqStack.h

#pragma once
#include <iostream>
#define StackSize 100
using namespace std;
typedef char DataType;
typedef struct 
{
	DataType stack[StackSize];
	int top[2];
}SSeqStack;
void InitStack(SSeqStack *S)
{
	S->top[0] = 0;
	S->top[1] = StackSize - 1;
}
int GetTop(SSeqStack S, DataType *e, int flag)
{
	switch (flag)
	{
	case 1:
		if (S.top[0]==0)
		{
			return 0;
		}
		else
		{
			*e = S.stack[S.top[0] - 1];
			break;
		}
	case 2:
		if (S.top[1]==StackSize-1)
		{
			return 0;
		}
		else
		{
			*e=S.stack[S.top[1] + 1];
			break;
		}
	default:
		return 0;
	}
	return 1;
}

int PushStack(SSeqStack *S, DataType e, int flag)
{
	if (S->top[0]==S->top[1])
	{
		return 0;
	}
	switch (flag)
	{
	case 1:
		S->stack[S->top[0]] = e;
		S->top[0]++;
		break;
	case 2:
		S->stack[S->top[1]] = e;
		S->top[1]--;
		break;
	default:
		return 0;
	}
	return 1;
}
int PopStack(SSeqStack *S, DataType *e, int flag)
{
	switch (flag)
	{
	case 1:
		if (S->top[0]==0)
		{
			return 0;
		}
		else
		{
			S->top[0]--;
			*e = S->stack[S->top[0]];
			break;
		}
	case 2:
		if (S->top[1]==StackSize-1)
		{
			return 0;
		}
		else
		{
			S->top[1]++;
			*e = S->stack[S->top[1]];
			break;
		}
	default:
		return 0;
	}
	return 1;
}
int StackEmpty(SSeqStack S, int flag)
{
	switch (flag)
	{
	case 1:
		if (S.top[0]==0)
		{
			return 1;
		}
		else
		{
			break;
		}
	case 2:
		if (S.top[1]==StackSize-1)
		{
			return 1;
		}
		else
		{
			break;
		}

	default:
		cout<<"输入的flag参数错误!";
		return -1;
	}
	return 0;
}

main.cpp

#include <stdlib.h>
#include <stdio.h>
#include "SSeqStack.h"
#define CHAR1 "左端栈的栈顶元素是:%c,右端栈的栈顶元素是:%c\n"
#define CHAR2 "%5c"

void main()
{
	SSeqStack S;
	int i;
	DataType a[] = {'a','b','c','d','e','f'};
	DataType b[] = {'p','w','x','y','z'};
	DataType e1, e2;
	InitStack(&S);
	for (i = 0; i < sizeof(a) / sizeof(a[0]);i++)
	{
		if (PushStack(&S,a[i],1)==0)
		{
			cout << "栈已满,不能入栈!";
			return;
		}
	}
	for (i = 0; i < sizeof(b) / sizeof(b[0]);i++)
	{
		if (PushStack(&S,b[i],2)==0)
		{
			cout << "栈已满,不能入栈!";
			return;
		}
	}
	if (GetTop(S,&e1,1)==0)
	{
		cout << "栈已空!";
		return;
	}
	if (GetTop(S, &e2, 2) == 0)
	{
		cout << "栈已空!";
		return;
	}
	printf(CHAR1, e1, e2);
	cout << "左端栈的出栈的元素次序是:";
	while (!StackEmpty(S,1))
	{
		PopStack(&S,&e1, 1);
		printf(CHAR2, e1);
	}
	cout << endl;
	cout << "右端栈的出栈的元素次序是:";
	while (!StackEmpty(S, 2))
	{
		PopStack(&S, &e2, 2);
		printf(CHAR2, e2);
	}

	cout << endl;

	system("pause");
}

结果:

扫描二维码关注公众号,回复: 4251895 查看本文章

猜你喜欢

转载自blog.csdn.net/baidu_36669549/article/details/84324569