4.19 手写简单循环队列与栈

1、通过模板类写一个栈,实现Push和Pop操作。

应用:将任一十进制数转换成十六进制数。

#include <iostream>
using namespace std;
const int maxn=1e4+10;
template <class T>
class Stack
{
    T stk[maxn];
    int top;
public:
    Stack()
    {
        top=0;   //初始化栈顶指针
    }
    void Push(T x);
    T Pop();
    bool Stackfull();
    bool Stackempty();
};
template <class T>
bool Stack<T>::Stackfull()  //判断栈是否已满
{
    return top==maxn-1;       //若top==maxn-1 ,返回true,否则返回false
}
template <class T>
bool Stack<T>::Stackempty() //判断栈是否为空
{
    return top==0;   //若top==0,返回true,否则返回false
}
template <class T>
void Stack<T>::Push(T x){
    if(Stackfull())
    {
        cout<<"Stack is full!"<<endl;
        return ;
    }
    stk[top++]=x;
}
template <class T>
T Stack<T>::Pop()
{
    if(Stackempty()){
        cout<<"Stack is empty!"<<endl;
        return 0;
    }
    return stk[--top];
}
int main()
{
    Stack<int> st;
    int n;
    cin>>n;
    while(n)
    {
        st.Push(n%16);
        n/=16;
    }
    while(!st.Stackempty())
    {
        int x=st.Pop();
        if(x<9) cout<<x;
        else cout<<char(x-10+'A');
    }
    cout<<endl;
    return 0;
}
 
 

2、手写队列类模板 实现Push与Pop操作:

通过head指针与tail指针的指向来判断队列是否为空或已满。

①当head==tail时,说明队列为空。

②当(tail+1)%(队列长度)==head时,说明队列已满。//因为运用循环队列思想,所以通过取模运算实现循环

应用:

模拟银行排队取号、叫号系统:

#include <iostream>
using namespace std;
const int maxn=1e2+10;  
template <class T>
class Queue
{
    T que[maxn];
    int head,tail;
public:
    Queue()
    {
        head=tail=-1; //head 、tail指向队首元素的前一个位置
    }
    bool QueEmpty()
    {
        return head==tail;
    }
    bool QueFull()
    {
        return (tail+1)%maxn==head;
    }
    void Push(T x)
    {
        if(QueFull()){
            cout<<"等待队列已满"<<endl;
            return ;
        }
        tail++;
        tail%=maxn;   //tail指针后移 实现入队操作
        que[tail]=x;
    }
    T Pop()
    {
        if(QueEmpty())
        {
            cout<<"当前队列为空"<<endl;
            return 0;
        }
        head++;
        head%=maxn;
        return que[head];   //head 指针后移,实现出队操作
    }
};
int main()
{
    Queue<int> q;
    int num=0,choice=0;  //num代表排队序号,choice 表示客户的选择
    do{
        cout<<"******** -1- 要号********"<<endl;
        cout<<"******** -2- 叫号********"<<endl;
        cout<<"******** -0- 退出********"<<endl;
        cout<<"Choose the serve"<<endl;
        cin>>choice;
        switch(choice)    //简单的switch选择结构
        {
        case 1:
            {
                q.Push(++num);
                cout<<"您的等待序号为"<<num<<endl;
                break;
            }
        case 2:
            {
                cout<<"请"<<q.Pop()<<"号客户到柜台办理业务"<<endl;
                break;
            }
        case 0:
            {
                cout<<"-quit-"<<endl;
                break;
            }
        default:
            {
                cout<<"-error-"<<endl;
                break;
            }
        }
    }while(choice);
    return 0;
}

蒟蒻求神犇轻喷……


猜你喜欢

转载自blog.csdn.net/acerkoo/article/details/80028314
今日推荐