栈和队列的实现以及代码

1.在刚开始的界面用户可以自己选择栈操作或者队列操作

 

 2.在栈里,进行入栈操作,以“658 365 36 32”为例以此入栈,遍历进行展示

 

 

3.进行出栈,会把658出栈,遵循“先进后出”原则,遍历进行展示 

 

 

 

4.进行取栈顶元素以及判空,由于658以及出栈,所以当前栈顶元素为365 

 

 

 

 

5.在队列操作里,进行入队操作,以“20 25 587 6837”为例,遍历进行展示 

 

 

6.出队操作,遵循“先进先出”原则,会把20出队 

 

7.由于20已经出队,当前队顶元素为25 

 

 

 

 

8.源码如下所示:

#include <iostream>
using namespace std;
//const int StackSize = 10;
//const int QueueSize = 10;
void Stackmenu();
void menu();
void queuemenu();
template<typename t>
struct Node
{
    t data;
    Node<t>* next;
    Node<t>* prior;
};
template<typename T>
struct QNode
{
    T data;
    QNode<T>* next;
    QNode<T>* prior;
};
template <typename t>
class LStack
{
public:
    LStack();
    ~LStack();
    void push(t x);
    t pop();
    t getTop();
    int empty();
    void printstack();
private:
    Node<t>* top;
};
template<typename t>
LStack<t>::LStack()
{
    top = nullptr;
}
template<typename t>
LStack<t>::~LStack()
{

}
template<typename t>
void LStack<t>::printstack()
{
    if (top ==nullptr)
    {
        cout << "当前栈为空;"<<endl;
    }
    else
    {
        cout << "当前栈为:";
        Node<t>* p = top;
        while (p)
        {
            cout << p->data << "   ";
            p = p->next;
        }
        system("pause");
        //Stackmenu();
    }
}
template<typename t>
void LStack<t>::push(t x)
{
    Node<t>* s = new Node<t>;
    s->data = x;
    s->next = top;
    top = s;
}
template<typename t>
t LStack<t>::pop()
{
    t x;
    Node<t>* p;
    if (top == nullptr)
    {
        cout << "下溢"<<endl;
        system("pause");
        Stackmenu();
    }
    else
    {
        x = top->data ;
        p = top;
        top = top->next;
        delete p;
        return x;
    }
}
template<typename t>
t LStack<t>::getTop()
{
    t x;
    if (top == nullptr)
    {
        cout << "下溢"<<endl;
        system("pause");
        Stackmenu();
    }
    else 
    {
        x = top->data ;
        return x;
    }
}
template<typename t>
int LStack<t>::empty()
{
    if (top == nullptr)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
template<typename T>
class LQueue
{
public:
    LQueue();
    ~LQueue();
    void enQueue(T x);
    T deQueue();
    T getQueue();
    int empty();
    void printqueue();
private:
    QNode<T>* front, * rear;
};
template<typename T>
void LQueue<T>::printqueue ()
{
    if (front == rear)
    {
        cout << "当前队列为空"<<endl;
    }
    else
    {
        cout << "当前队列为:";
        QNode<T>* p = front->next ;
        while (p)
        {
            cout << p->data << "   ";
            p = p->next;
        }
        system("pause");
        //queuemenu();
    }
}
template<typename T>
LQueue<T>::LQueue()
{
    QNode<T>* s = new QNode<T>;
    s->next = nullptr;
    front = rear = s;
}
template<typename T>
LQueue<T>::~LQueue()
{

}
template<typename T>
void LQueue<T>::enQueue(T x)
{
    QNode<T>* s = new QNode<T>;
    s->data = x;
    s->next = nullptr;
    rear->next = s;
    rear = s;
}
template<typename T>
T LQueue<T>::deQueue()
{
    T x;
    if (rear == front)
    {
        cout << "下溢"<<endl;
        system("pause");
        queuemenu();
    }
    else
    {
        QNode<T>* p;
        p = front->next;
        x = p->data;
        front->next = p->next;
        if (p->next == nullptr)
        {
            rear = front;
        }
        delete p;
        return x;
    }
}
template<typename T>
T LQueue<T>::getQueue()
{
    T x;
    if (rear == front)
    {
        cout << "下溢"<<endl;
        system("pause");
        queuemenu();
    }
    else
    {
        x = front->next->data;
        return x;
    }
}
template<typename T>
int LQueue<T>::empty()
{
    if (rear == front)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
void queuemenu()
{
    LQueue<string> q;
    for (;;)
    {
        system("cls");
        int choice;
        string i;
        cout << "请选择功能:" << endl;
        cout << "1.入队" << endl;
        cout << "2.出队" << endl;
        cout << "3.取队顶元素" << endl;
        cout << "4.判空" << endl;
        cout << "5.打印" << endl;
        cout << "0.返回上一级" << endl;
        cout << "-1.退出程序" << endl;
        cin >> choice;
        switch (choice)
        {
        case 1:
            cout << "请输入要入队的元素:";
            cin >> i;
            q.enQueue(i);
            system("pause");
            break;
        case 2:
            cout << "出队的元素为:" << q.deQueue () << endl;
            system("pause");
            break;
        case 3:
            cout << "当前队顶的元素为:" << q.getQueue () << endl;
            system("pause");
            break;
        case 4:
            if (q.empty () == 1)
            {
                cout << "当前队为空" << endl;
            }
            else
            {
                cout << "当前队不为空" << endl;
            }
            system("pause");
            break;
        case 5:
            //cout << "当前队列为:";
            q.printqueue();
            cout << endl;
            system("pause");
            break;
        case 0:
            menu();
            system("pause");
            break;
        case -1:
            exit(0);
        default:
            cout << "输入错误,请重新输入" << endl;
            system("pause");
            break;
        }
    }
}
void  Stackmenu()
{
    LStack<string> s;
    for (;;)
    {
        system("cls");
        int choice;
        string i;
        cout << "请选择功能:" << endl;
        cout << "1.入栈" << endl;
        cout << "2.出栈" << endl;
        cout << "3.取栈顶元素" << endl;
        cout << "4.判空" << endl;
        cout << "5.打印" << endl;
        cout << "0.返回上一级" << endl;
        cout << "-1.退出程序" << endl;
        cin >> choice;
        switch (choice)
        {
        case 1:
            cout << "请输入要入栈的元素:";
            cin >> i;
            s.push(i);
            system("pause");
            break;
        case 2:
            cout << "出栈的元素为:"<<s.pop() << endl;
            system("pause");
            break;
        case 3:
            cout << "当前栈顶的元素为:"<<s.getTop() << endl;
            system("pause");
            break;
        case 4:
            if (s.empty() == 1)
            {
                cout << "当前栈为空" << endl;
            }
            else
            {
                cout << "当前栈不为空" << endl;
            }
            system("pause");
            break;
        case 5:
            //cout << "当前队列为:";
            s.printstack();
            cout << endl;
            system("pause");
            break;
        case 0:
            menu();
            system("pause");
            break;
        case -1:
            exit(0);
        default:
            cout << "输入错误,请重新输入" << endl;
            system("pause");
            break;
        }
        //system("pause");
    }
}
void menu()
{
    int choice;
    for (;;)
    {
        system("cls");
        cout << "请选择功能:"<<endl;
        cout << "1.栈" << endl;
        cout << "2.队列" << endl;
        cout << "-1.退出程序" << endl;
        cin >> choice;
        switch (choice)
        {
        case 1:
            Stackmenu();
            break;
        case 2:
            queuemenu();
            break;
        case -1:
            exit(0);
        default:
            cout << "输入错误,请重新输入" << endl;
            system("pause");
            break;
        }
    }
}
int main()
{
    menu();
    return 0;
}

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值