版权声明:本文为博主原创文章,未经博主允许不得转载。 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 查看本文章