回首栈与队列

题目如下:分别用两个队列实现一个栈、两个栈实现一个队列。
不喜欢啰嗦了,直接上代码:

/************************************************************************/
/*
    用两个stack模拟queue
*/
/************************************************************************/
template <typename T> class CQueue {
public:
    CQueue(void) {}
    ~CQueue(void) {}

    void appendTail(const T& node);
    T deleteHead();

private:
    stack<T> stack1;
    stack<T> stack2;
};

template<typename T> void CQueue<T>::appendTail(const T& element) {
    stack1.push(element);
}

template<typename T> T CQueue<T>::deleteHead() {
    if (stack2.size() <= 0) {
        while (stack1.size() > 0) {
            T& data = stack1.top();
            stack1.pop();
            stack2.push(data);
        }
    }

    if (stack2.size() == 0) {
        throw new exception("queue is empty.");
    }

    T head = stack2.top();
    stack2.pop();
    return head;
}

下面的是两个队列实现栈,给出了两个版本,方法名带1的表示稍作改进,咳咳细细审核一下,有错的地方还望批评指正:

/************************************************************************/
/*
    用两个queue实现stack
*/
/************************************************************************/

template<typename T> class CStack {
public:
    CStack():eleCnt(0) { }
    ~CStack() {}

    T pop();
    T pop1();
    void push(const T& element);
    void push1(const T& element);
    int getTotal();
private:
    queue<T> queue1;
    queue<T> queue2;
    int eleCnt;
};

template <typename T> int CStack<T>::getTotal() {
    return eleCnt;
}

template<typename T> void CStack<T>::push(const T& ele) {
    queue1.push(ele);
    eleCnt++;
}
//queue1 专门负责进出队列 
//queue2 用来做中转站
//坏处:每次出栈一个元素,都需要来回移动两遍元素
template<typename T> T CStack<T>::pop() {
    if (queue1.empty()) {
        throw new exception("stack is empty.");
    }
    T tmp;
    while (queue1.size() != 1) {
        tmp = queue1.front();
        queue1.pop();
        queue2.push(tmp);
    }

    tmp = queue1.front();
    queue1.pop();
    while (queue2.size() != 0) {
        T tmp1 = queue2.front();
        queue2.pop();
        queue1.push(tmp1);
    }
    return tmp;
}
template<typename T> void CStack<T>::push1(const T& ele) {
    if (queue1.empty() && queue2.empty()) {
        queue1.push(ele);
    }
    else if (queue1.size() > 0) {
        queue1.push(ele);
    }
    else if(queue2.size() > 0) {
        queue2.push(ele);
    }
    eleCnt ++;
}
//queue1和queue2轮流负责进出栈,但需要保证至少有一个栈是空的
template<typename T> T CStack<T>::pop1() {
    if (queue1.empty() && queue2.empty()) {
        throw new exception("stack is empty.");
    }

    T tmp;
    if (queue2.empty()) { //从queue1出栈
        while (queue1.size() != 1) {
            tmp = queue1.front();
            queue1.pop();
            queue2.push(tmp);
        }

        tmp = queue1.front();
        queue1.pop();
    }
    else {//从queue2出栈
        while (queue2.size() != 1) {
            tmp = queue2.front();
            queue2.pop();
            queue1.push(tmp);
        }
        tmp = queue2.front();
        queue2.pop();
    }
    return tmp;
}

验证如下:

int main(){
    CStack<int> stacks;
    stacks.push1(4);
    stacks.push1(3);
    stacks.push1(2);
    cout << stacks.pop1() << endl;
    system("pause");
    return 0;
}

结果是输出2.后进先出嘛~~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值