江西师范大学2022年软件学院软件工程(互联网软件开发方向班)数据结构作业
1.
题目内容:
在一个数组中实现两个堆栈。完成Push以及Pop函数。
类型定义以及函数接口定义:
typedef int ElemType;
typedef enum { push, pop, End } Operation; //枚举类型
//MaxSize堆栈数组的规模;Stack结构定义如下:
typedef struct SNode
{
ElemType *Data;
int Top1, Top2; //指向真实的栈顶位置,栈1空条件Top1=-1,栈2空条件Top2=MaxSize
int MaxSize; //记录该双端栈最多可容纳的元素个数
} Stack;
//其中Tag是堆栈编号,取1或2;
bool CreateStack( Stack &S,int maxSize);
//初始化一个可以容纳maxSize个元素的双端栈,并进行初始化,
//Top1=-1,Top2=MaxSize;初始化成功返回true,否则返回false;
bool Push( Stack &S, ElemType X, int Tag );
//Tag=1 表示入栈1, Tag=2 表示入栈2,如果堆栈已满,Push函数必须输出“Stack Full”,
//并且返回false,入栈成功返回true;Tag不等于1或者2 操作失败 返回false
bool Pop( Stack &S, ElemType &X, int Tag);
//Tag=1 表示栈1出栈,Tag=2表示栈2出栈,并将栈顶元素赋值给X。
//如果该堆栈是空的,则Pop函数必须输出“Stack Tag Empty”(其中Tag是该堆栈的编号),并且返回false,否则返回true。
//Tag不等于1或者2 操作失败 返回false
Operation GetOp();
void PrintStack( Stack &S, int Tag );
样例程序代码:
#include <iostream>
#include <cstring>
using namespace std;
typedef int ElemType;
typedef enum { push, pop, End } Operation; //枚举类型
//MaxSize堆栈数组的规模;Stack结构定义如下:
typedef struct SNode
{
ElemType *Data;
int Top1, Top2; //指向真实的栈顶位置,栈1空条件Top1=-1,栈2空条件Top2=MaxSize
int MaxSize; //记录该双端栈最多可容纳的元素个数
} Stack;
//其中Tag是堆栈编号,取1或2;
bool CreateStack( Stack &S,int maxSize);
//初始化一个可以容纳maxSize个元素的双端栈,并进行初始化,
//Top1=-1,Top2=MaxSize;初始化成功返回true,否则返回false;
bool Push( Stack &S, ElemType X, int Tag );
//Tag=1 表示入栈1, Tag=2 表示入栈2,如果堆栈已满,Push函数必须输出“Stack Full”,
//并且返回false,入栈成功返回true;Tag不等于1或者2 操作失败 返回false
bool Pop( Stack &S, ElemType &X, int Tag);
//Tag=1 表示栈1出栈,Tag=2表示栈2出栈,并将栈顶元素赋值给X。
//如果该堆栈是空的,则Pop函数必须输出“Stack Tag Empty”(其中Tag是该堆栈的编号),并且返回false,否则返回true。
//Tag不等于1或者2 操作失败 返回false
Operation GetOp();
void PrintStack( Stack &S, int Tag );
int main()
{
int N, Tag;
ElemType X;
Stack S;
int done = 0;
cin>>N;
if (CreateStack(S,N)==false) return 0;
while ( !done )
{
switch( GetOp() )
{
case push:
cin>>Tag>>X;
if (!Push(S, X, Tag)) cout<<"Stack is Full!"<<endl;
break;
case pop:
cin>>Tag;
if (!Pop(S, X, Tag)) cout<<"Stack "<<Tag<<" is Empty!"<<endl;
break;
case End:
PrintStack(S, 1);
PrintStack(S, 2);
done = 1;
break;
}
}
return 0;
}
Operation GetOp()
{
char op[5];
cin>>op;
if (strcmp(op,"Push")==0) return push;
if (strcmp(op,"Pop")==0) return pop;
if (strcmp(op,"End")==0) return End;
}
void PrintStack( Stack &S, int Tag )
{
if (Tag==1)
{
cout<<"Pop from Stack 1:";
while(S.Top1!=-1)
{
cout<<" "<<S.Data[S.Top1--];
}
cout<<endl;
}
else
{
cout<<"Pop from Stack 2:";
while(S.Top2!=S.MaxSize)
{
cout<<" "<<S.Data[S.Top2++];
}
cout<<endl;
}
}
bool CreateStack(Stack &S, int MaxSize )
{
S.Data=new ElemType[MaxSize];
if (S.Data==NULL) return false; //空间申请失败,放回false
S.Top1=-1;
S.Top2=MaxSize;
S.MaxSize=MaxSize;
return true;
}
/*你的代码写在这里,请提交完整程序,完成Push,Pop函数的编写*/
补充程序答案:
bool Push( Stack &S, ElemType X, int Tag ) {
if(S.Top2-S.Top1==1){
/*判断共享栈是否已满(当栈满时S.Top1刚好在S.Top2的前一个位置处所以判断条件为S.Top2-S.Top1==1)*/
printf("Stack Full\n"); //题目要求输出
return false;
}
if(Tag==1){ //栈一的入栈操作
S.Data[++(S.Top1)]=X; //S.Top1栈顶指针初始值为-1,现进行先自加对栈进行数据入栈操作
return true;
}
else{ //否则对栈二进行入栈操作
S.Data[--(S.Top2)]=X; //S.Top2栈顶指针初始值为S.MaxSize,所以要进行先自减进行数据入栈操作
return true;
}
}
bool Pop( Stack &S, ElemType &X, int Tag) {
if(Tag==1){ //Tag = 1 对栈一进行出栈操作
if(S.Top1==-1){ //S.Top1 == -1说明栈顶指针咩有移动,没有进行入栈操作,则栈一内无数据
printf("Stack %d Empty\n",Tag); //题目要求输出
return 0;
}
X = S.Data[(S.Top1)--]
return 1; // 返回此时栈顶元素,然后栈顶指针自减移向下一个元素
}
else{
if(S.Top2==S.MaxSize){ // 与栈一判断是否空栈同理
printf("Stack %d Empty\n",Tag); //题目要求
return 0;
}
X = S.Data[(S.Top2)++]
return 1; //与栈一出栈操作同理
}
}
此文章用于记录一位普通的江西师大学子的学习路程,仅供各位参考,理解思路以后自己动手最好,杜绝Ctrl+c。