【数据结构】栈的基本操作(C++)

实验内容:

  1. 编程实现栈的以下基本操作:建栈、取栈顶元素、入栈、出栈。
  2. 编程实现队列的以下基本操作:建队列、取队头元素、入队、出队。
#include <iostream>
using namespace std;

typedef int SElemType;
typedef int QElemType;
typedef int Status;

#define MAXSIZE 100
#define OK 1
#define ERROR 0

Status Menu();
//栈操作
//注意栈顶指针不指向元素,而指向栈顶元素的上一个位置
typedef struct
{
    SElemType *base; //栈底指针
    SElemType *top; //栈顶指针
    int stacksize; //栈可用最大容量
}SqStack;
//顺序栈的初始化
Status InitStack(SqStack &S)
{
    S.base=new SElemType[MAXSIZE];
    if(!S.base) return ERROR;
    S.top=S.base;
    S.stacksize=MAXSIZE;
    return OK;
}
//入栈操作,在栈顶插入一个新的元素
Status Push(SqStack &S,SElemType e)
{
    if(S.top-S.base==S.stacksize) return ERROR;
    *S.top=e;
    S.top++;
    cout<<"入栈成功!"<<endl;
    return OK;
}
//出栈操作,删除栈顶元素
Status Pop(SqStack &S,SElemType &e)
{
    if(S.top==S.base) return ERROR;
    e=*--S.top;
    cout<<"出栈成功!"<<endl;
    return OK;
}
//取栈顶元素
Status GetTop(SqStack S)
{
    if(S.top==S.base) return ERROR;
    if(S.top!=S.base) return *(S.top-1);
}
//创建一个栈
Status Create(SqStack &S,int n){
    cout<<"请输入入栈值:"<<endl;
    for(int i=0;i<n;i++){
        SElemType e;
        cin>>e;
        Push(S,e);
    }
    return OK;
}
//链栈操作
typedef struct StackNode
{
    SElemType data;
    struct StackNode *next;
}StackNode,*LinkStack;
//初始化链栈
Status InitSN(LinkStack &S)
{
    S=NULL;
    return OK;
}
//链栈的入栈
Status PushSN(LinkStack &S,SElemType e)
{
   LinkStack p=new StackNode;
   p->data=e;
   p->next=S;
   S=p;
   cout<<"入栈成功!"<<endl;
   return OK;
}
//链栈的出栈
Status PopSN(LinkStack &S,SElemType &e){
    if(S==NULL){
        return ERROR;
    }
    e=S->data;
    LinkStack p=new StackNode;
    p=S;
    S=S->next;
    delete p;
    return OK;
}
//取栈顶元素
Status GetTopSN(LinkStack S){
    if(S!=NULL) return S->data;
}
//创建链栈
Status CreateSN(LinkStack &S,int n){
    cout<<"请输入入栈值:"<<endl;
    for(int i=0;i<n;i++){
        SElemType e;
        cin>>e;
        PushSN(S,e);
    }
    return OK;
}
//队列操作
typedef struct{
    QElemType *base;//储存的基地址
    int front;
    int rear;
}SqQueue;
//初始化队列
Status InitQueue(SqQueue &Q){
    Q.base=new QElemType[MAXSIZE];
    if(!Q.base) return ERROR;
    Q.front=Q.rear=0;
    return OK;
}
//求队列的长度
int QueueLength(SqQueue &Q){
    return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
//入队
Status EnQueue(SqQueue &Q,QElemType e){
    if((Q.rear+1)%MAXSIZE==Q.front) return ERROR;
    Q.base[Q.rear]=e;
    Q.rear=(Q.rear+1)%MAXSIZE;
    cout<<"入队成功!"<<endl;
    return OK;
}
//出队
Status OuQueue(SqQueue &Q,QElemType &e){
    if(Q.rear==Q.front) return ERROR;
    e=Q.base[Q.front];
    Q.front=(Q.front+1)%MAXSIZE;
    return OK;
}
//取循环队列的队头元素
Status GetHead(SqQueue &Q){
    if(Q.front!=Q.rear){
        return Q.base[Q.front];
    }
}
//创建队列
CreateQueue(SqQueue &Q,int n){
    if(n>MAXSIZE) return ERROR;
     cout<<"请输入入栈值:"<<endl;
    for(int i=0;i<n;i++){
        QElemType e;
        cin>>e;
        EnQueue(Q,e);
    }
    return OK;
}
//链队操作
typedef struct QNode{
    QElemType data;
    struct QNode *next;
}QNode ,*QueuePtr;
typedef struct{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;
//链队初始化
Status InitQN(LinkQueue &Q){
    Q.front=Q.rear=new QNode;
    Q.front->next=NULL;
    return OK;
}
//链队的入队
Status EnQN(LinkQueue &Q,QElemType e){
    QueuePtr p=new QNode;
    p->data=e;
    p->next=NULL;
    Q.rear->next=p;
    Q.rear=p;
    cout<<"入队成功!"<<endl;
    return OK;
}
//链队的出队
Status OuQN(LinkQueue &Q,QElemType &e){
    if(Q.rear==Q.front) return ERROR;
    QueuePtr p=new QNode;
    p=Q.front->next;
    e=p->data;
    Q.front->next=p->next;
    delete p;
    return OK;
}
//取队头元素
Status GetHeadN(LinkQueue &Q){
    if(Q.front!=Q.rear)
        return Q.front->next->data;
}
//创建链栈
CreateQN(LinkQueue &Q,int n){
    if(n>MAXSIZE) return ERROR;
     cout<<"请输入入栈值:"<<endl;
    for(int i=0;i<n;i++){
        QElemType e;
        cin>>e;
        EnQN(Q,e);
    }
    return OK;
}

Status Switch1(SqStack &S,int &a){
     switch(a){
        case 1:
            InitStack(S);
            int len;
            cout<<"栈建造并初始化成功!"<<endl;
            cout<<"请输入想要建立的栈的长度:"<<endl;
            cin>>len;
            Create(S,len);
            cout<<"创建成功!"<<endl;
            break;
        //出栈
        case 2:
            SElemType e1;
            Pop(S,e1);
            cout<<"删除的栈顶元素为:"<<e1<<endl;
            break;
        //入栈
        case 3:
            SElemType e2;
            cout<<"请输入想要插入的栈顶值:"<<endl;
            cin>>e2;
            Push(S,e2);
            break;
        //取栈顶元素
        case 4:
            SElemType e3;
            e3=GetTop(S);
            cout<<"栈顶元素为:"<<e3<<endl;
            break;
        case 5:
            a=0;
            return 0;
    }
}
Status Menu1(){
    cout<<"-----栈的基本操作----"<<endl;
    cout<<"------1.栈的建立-----"<<endl;
    cout<<"--------2.出栈-------"<<endl;
    cout<<"--------3.入栈-------"<<endl;
    cout<<"----4.取栈顶元素-----"<<endl;
    cout<<"----5.退出栈操作-----"<<endl;
    int a=100;
    SqStack S;
    while(a>0){
        int A;
        cout<<"请输入操作编号:"<<endl;
        cin>>A;
        a=A;
        if(a>=6){
            cout<<"非法输入!"<<endl;
            continue;
        }
        Switch1(S,a);
        }
    return OK;
}
Status Switch2(LinkStack &S,int &b){
 switch(b){
        case 1:
            InitSN(S);
            int len1;
            cout<<"链栈建造并初始化成功!"<<endl;
            cout<<"请输入想要建立的链栈的长度:"<<endl;
            cin>>len1;
            CreateSN(S,len1);
            cout<<"创建成功!"<<endl;
            break;
        //出栈
        case 2:
            SElemType e1;
            PopSN(S,e1);
            cout<<"删除的链栈顶元素为:"<<e1<<endl;
            break;
        //入栈
        case 3:
            SElemType e2;
            cout<<"请输入想要插入的链栈顶值:"<<endl;
            cin>>e2;
            PushSN(S,e2);
            break;
        //取栈顶元素
        case 4:
            SElemType e3;
            e3=GetTopSN(S);
            cout<<"栈顶元素为:"<<e3<<endl;
            break;
        case 5:
            b=0;
            return 0;
    }
}
Status Menu2(){
    cout<<"-----链栈的基本操作----"<<endl;
    cout<<"------1.链栈的建立-----"<<endl;
    cout<<"--------2.出栈--------"<<endl;
    cout<<"--------3.入栈--------"<<endl;
    cout<<"-----4.取栈顶元素-----"<<endl;
    cout<<"----5.退出链栈操作----"<<endl;
    int b=100;
    LinkStack S;
    while(b>0){
        int B;
        cout<<"请输入操作编号:"<<endl;
        cin>>B;
        b=B;
        if(b>=6){
            cout<<"非法输入!"<<endl;
            continue;
        }
        Switch2(S,b);
    }
    return OK;
}
Status Switch3(SqQueue &Q,int &b){
 switch(b){
        case 1:
            InitQueue(Q);
            int len1;
            cout<<"队列建造并初始化成功!"<<endl;
            cout<<"请输入想要建立队列的长度:"<<endl;
            cin>>len1;
            CreateQueue(Q,len1);
            cout<<"创建成功!"<<endl;
            break;
        case 2:
            QElemType e1;
            OuQueue(Q,e1);
            cout<<"删除的队列元素为:"<<e1<<endl;
            break;
        case 3:
            QElemType e2;
            cout<<"请输入想要插入的队列值:"<<endl;
            cin>>e2;
            EnQueue(Q,e2);
            break;
        case 4:
            QElemType e3;
            e3=GetHead(Q);
            cout<<"队头元素为:"<<e3<<endl;
            break;
        case 5:
            int len;
            len=QueueLength(Q);
            cout<<"队头长度为:"<<len<<endl;
            break;
        case 6:
            b=0;
            return 0;
    }
}
Status Menu3(){
    cout<<"-----队列的基本操作----"<<endl;
    cout<<"------1.队列的建立-----"<<endl;
    cout<<"--------2.出队--------"<<endl;
    cout<<"--------3.入队--------"<<endl;
    cout<<"--4.取循环队列头元素--"<<endl;
    cout<<"-----5.队列的长度-----"<<endl;
    cout<<"----6.退出链栈操作----"<<endl;
    int b=100;
    SqQueue Q;
    while(b>0){
        int B;
        cout<<"请输入操作编号:"<<endl;
        cin>>B;
        b=B;
        if(b>=7){
            cout<<"非法输入!"<<endl;
            continue;
        }
        Switch3(Q,b);
    }
    return OK;
}
Status Switch4(LinkQueue &Q,int &b){
 switch(b){
        case 1:
            InitQN(Q);
            int len1;
            cout<<"链队建造并初始化成功!"<<endl;
            cout<<"请输入想要建立链队的长度:"<<endl;
            cin>>len1;
            CreateQN(Q,len1);
            cout<<"创建成功!"<<endl;
            break;
        case 2:
            QElemType e1;
            OuQN(Q,e1);
            cout<<"删除的链队元素为:"<<e1<<endl;
            break;
        case 3:
            QElemType e2;
            cout<<"请输入想要插入的队列值:"<<endl;
            cin>>e2;
            EnQN(Q,e2);
            break;
        case 4:
            QElemType e3;
            e3=GetHeadN(Q);
            cout<<"队头元素为:"<<e3<<endl;
            break;
        case 5:
            b=0;
            return 0;
    }
}
Status Menu4(){
    cout<<"-----链队的基本操作----"<<endl;
    cout<<"------1.链队的建立-----"<<endl;
    cout<<"--------2.出队--------"<<endl;
    cout<<"--------3.入队--------"<<endl;
    cout<<"--4.取循环队列头元素--"<<endl;
    cout<<"----5.退出链栈操作----"<<endl;
    int b=100;
    LinkQueue Q;
    while(b>0){
        int B;
        cout<<"请输入操作编号:"<<endl;
        cin>>B;
        b=B;
        if(b>=6){
            cout<<"非法输入!"<<endl;
            continue;
        }
        Switch4(Q,b);
    }
    return OK;
}
Status Menu(){
    cout<<"-----可选择的操作-----"<<endl;
    cout<<"----1.栈的基本操作----"<<endl;
    cout<<"---2.链栈的基本操作---"<<endl;
    cout<<"---3.队列的基本操作---"<<endl;
    cout<<"---4.链队的基本操作---"<<endl;
    cout<<"--------5.退出--------"<<endl;
}
Status Switch(){
    int ch0=0;
    while(ch0>=0){
        Menu();
        int ch;
        cout<<"请输入操作编号:"<<endl;
        cin>>ch;
        ch0=ch;
        if(ch0>=6){
        cout<<"非法输入!"<<endl;
        continue;
        }
        switch(ch0){
        case 1:
            Menu1();
            break;
        case 2:
            Menu2();
            break;
        case 3:
            Menu3();
            break;
        case 4:
            Menu4();
            break;
        case 5:
            cout<<"退出程序!"<<endl;
            return 0;
        }
    }
}
int main(){
    Switch();
    return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值