設已知有兩個堆棧S1和S2,請用這兩個堆棧模擬出一個隊列Q。
成都創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、江陰網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5場景定制、成都做商城網(wǎng)站、集團公司官網(wǎng)建設、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為江陰等各大城市提供網(wǎng)站開發(fā)制作服務。所謂用堆棧模擬隊列,實際上就是通過調(diào)用堆棧的下列操作函數(shù):
實現(xiàn)隊列的操作,即入隊void AddQ(ElementType item)和出隊ElementType DeleteQ()。
輸入說明
輸入首先給出兩個正整數(shù)N1和N2,表示堆棧S1和S2的大容量。隨后給出一系列的隊列操作:A item表示將item入列(這里假設item為整型數(shù)字);D表示出隊操作;T表示輸入結束。
輸出說明
對輸入中的每個D操作,輸出相應出隊的數(shù)字,或者錯誤信息ERROR:Empty。如果入隊操作無法執(zhí)行,也需要輸出ERROR:Full。每個輸出占1行。
示例輸入
3 2 A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D T
示例輸出
ERROR:Full 1 ERROR:Full 2 3 4 7 8 ERROR:Empty
類MyStack:
MyStack.h
#pragma once
class MyStack
{
public:
MyStack(int N);//構造函數(shù);
~MyStack();//析構函數(shù);
public://主要是函數(shù)成員與數(shù)據(jù)成員
bool IsFull();//是可以在聲明文件中實現(xiàn),通常在實現(xiàn)文件實現(xiàn)
bool IsEmpty();
void Push(int item);
int pop();
private:
const int m_N;
int m_top;
int * m_data;
};
MyStack.cpp
#include "MyStack.h"
#include "iostream"
using namespace std;
MyStack::MyStack(int N)
:m_N(N)//初始化;
{
//cout<< "調(diào)用MyStack的構造函數(shù)"<< endl;
m_top = m_N;
m_data = new int[m_N];
}
MyStack::~MyStack(void)//析構函數(shù),不能重載;
{
//cout<< "調(diào)用MyStack的析構函數(shù)"<< endl;
delete[] m_data;
}
bool MyStack::IsFull()
{
return m_top == 0;
}
bool MyStack::IsEmpty()
{
return m_top == m_N;
}
void MyStack::Push(int item)
{
m_data[--m_top] = item;//壓入堆棧
}
int MyStack::pop()
{
return m_data[m_top++];//挪出堆棧
}
類 MyQueue:
MyQueue.h
#pragma once
#include"MyStack.h"
class MyQueue
{
public:
MyQueue(int sizeOut,int sizeIn);
~MyQueue(void);
public:
bool IsEmpty();
bool IsFull();
void push(int data);
int pop();
private:
MyStack m_out;
MyStack m_in;
};
MyQueue.cpp
#include "MyQueue.h"
#include"iostream"
using namespace std;
MyQueue::MyQueue(int sizeOut, int sizeIn)
:m_out(sizeOut),m_in(sizeIn)
{
}
MyQueue::~MyQueue(void)
{
}
bool MyQueue::IsEmpty()
{
return m_out.IsEmpty() && m_in.IsEmpty();
}
bool MyQueue::IsFull()
{
return m_in.IsFull() && !m_out.IsEmpty();
}
void MyQueue::push(int data)
{
if (!m_in.IsFull())
{
m_in.Push(data);
}
else
{
if (m_out.IsEmpty())//前提為空
{
while (!m_in.IsEmpty())//入棧非空時循環(huán)進行
{
if (!m_out.IsFull())//出棧是否為滿
{
m_out.Push(m_in.pop());//沒滿進行入棧導出到出棧
}
else
{
cout<< "ERROR:Full"<< endl;//提示已滿
break;
}
}
m_in.Push(data);
}
}
}
int MyQueue::pop()
{
if (!m_out.IsEmpty())//如果出棧不為空
{
return m_out.pop();//直接返回
}
else
{
while (!m_in.IsEmpty())//入棧不為空,將入棧導入出棧
{
m_out.Push(m_in.pop());
}
return m_out.pop();//返回出棧的值
}
}
main函數(shù):
#include"iostream"
#include"MyStack.h"http://引用封裝的頭文件
#include"MyQueue.h"
using namespace std;
int main()
{
int sizeOut;
int sizeIn;
cout<< "請輸入輸出棧的大小"<< endl;
cin >>sizeOut;
cout<< "請輸入輸入棧的大小"<< endl;
cin >>sizeIn;//輸入結束的換行符會影響后續(xù)的輸入,導致getline讀入為空
cin.ignore();//忽略掉換行符,以后面讀入
if (sizeOut<= sizeIn)
{
cout<< "輸出棧的大小一定要大于輸入棧的大小,程序終止"<< endl;
return 0;
}
MyQueue myQueue(sizeOut, sizeIn);
char buf[200];
cout<< "請輸入你要執(zhí)行的操作比如A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D T,其中A是入列,D是出列,T是結束"<< endl;
cin.getline(buf,200);//讀入buf
char* pbuf = buf;
while (*pbuf != 'T')
{
if (*pbuf == 'A')
{
pbuf++;
while (*pbuf< '0' || *pbuf >'9')//整數(shù)域
{
if (*pbuf == 'T')
{
return 0;
}
pbuf++;
}
if (!myQueue.IsFull())//判斷是否已滿
{
myQueue.push(*pbuf - '0');//沒滿則壓入元素
}
else
{
cout<< "ERROR:Full"<< endl;//已滿提示
}
pbuf++;
}
else if (*pbuf == 'D')
{
if (!myQueue.IsEmpty())//判斷是否為空
{
cout<< myQueue.pop()<< endl;//非空進行輸出
}
else
{
cout<< "ERROR:Empty"<< endl;//已空提示
}
pbuf++;
}
else
{
pbuf++;
}
}
return 0;
}
使用編譯器vs.2022
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧