0
点赞
收藏
分享

微信扫一扫

数据结构—课外实验04—栈

浮游图灵 2022-03-27 阅读 48

江西师范大学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。

举报

相关推荐

0 条评论