C++火車入軌算法的實(shí)現(xiàn)代碼
【問題描述】
某城市有一個(gè)火車站,鐵軌鋪設(shè)如圖所示。有n節(jié)車廂從A方向駛?cè)胲囌?,按進(jìn)站順序編號為1~n。你的任務(wù)是讓它們按照某種特定的順序進(jìn)入B方向的鐵軌并駛出車站。為了重組車廂,你可以借助中轉(zhuǎn)站C。這是一個(gè)可以停放任意多節(jié)車廂的車站,但由于末端封頂,駛?cè)隒的車廂必須按照相反的順序駛出。對于每個(gè)車廂,一旦從A移入C,就不能再回到A了;一旦從C移入B,就不能回到C了。換句話說,在任意時(shí)刻,只有兩種選擇:A→C和C→B。
這個(gè)問題和之前數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)的火車入軌類似,而且較之簡化。自己嘗試寫了下,和書上參考答案的代碼量仍有較大差距。代碼如下:
#include<iostream>
using namespace std;
const int MAXSIZE=100;
void main()
{
int n;
cin>>n;
int a[MAXSIZE],b[MAXSIZE];
int stack[MAXSIZE];
for(int i=0;i<n;i++)
{
a[i]=i+1;
cin>>b[i]; //出棧順序
}
int top=-1;
int count=0;
int i=0;
for(;;)
{
if(i<n)
{
++top;
stack[top]=a[i++]; //入棧
cout<<"PUSH"<<endl;
}
if(stack[top]==b[count])
{
top--;count++;
cout<<"POP"<<endl;
}
else if(i==n)
{
cout<<"NO"<<endl;
break;
}
if(count==n)
{
cout<<"YES"<<endl;
break;
}
if(top<-1)
{
cout<<"NO"<<endl;
break;
}
}
}
書中參考代碼如下:
#include<iostream>
using namespace std;
const int MAXN=1000+10;
int n,target[MAXN];
void main()
{
while(cin>>n)
{
int stack[MAXN],top=0;
int A=1,B=1; //A用來記錄入棧次數(shù),B用來記錄出軌的火車序號
for(int i=1;i<=n;i++)
cin>>target[i]; //記錄出軌順序
int ok=1;
while(B<=n)
{
if(A==target[B]){A++;B++;}
else if(top && stack[top]==target[B]){top--;B++;} //出棧
else if((A<=n)) stack[++top]=A++; //入棧
else {ok=0;break;}
}
if(ok)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
同樣,可以用STL來實(shí)現(xiàn),只需對書中參考答案作微小改動,代碼如下:
/*STL棧來實(shí)現(xiàn)*/
#include<iostream>
#include<stack>
using namespace std;
const int MAXN=1000+10;
int n,target[MAXN];
int main()
{
while(cin>>n)
{
stack<int> s;
int A=1,B=1;
for(int i=1;i<=n;i++)
cin>>target[i];
int ok=1;
while(B<=n)
{
if(A==target[B]){A++;B++;}
else if(!s.empty() && s.top()==target[B]){s.pop();B++;}
else if(A<=n) s.push(A++);
else {ok=0;break;}
}
if(ok)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
【總結(jié)】
自己寫的代碼仍有優(yōu)化的空間。學(xué)習(xí)參考答案的清晰邏輯的表達(dá)。學(xué)習(xí)STL棧的使用。
聯(lián)系數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)中關(guān)于火車入軌的提升,對緩沖軌的限制,應(yīng)該增加一個(gè)判斷即可。
不知坑有多深的C++初學(xué)者 目前停留在“水題”階段 走一步看一步,摸著石頭過河 向大??待R
- c++11新增的便利算法實(shí)例分析
- 馬爾可夫鏈算法(markov算法)的awk、C++、C語言實(shí)現(xiàn)代碼
- C++線性時(shí)間的排序算法分析
- C++實(shí)現(xiàn)矩陣原地轉(zhuǎn)置算法
- C++實(shí)現(xiàn)一維向量旋轉(zhuǎn)算法
- 基于C++實(shí)現(xiàn)的各種內(nèi)部排序算法匯總
- C++堆排序算法的實(shí)現(xiàn)方法
- C++實(shí)現(xiàn)DES加密算法實(shí)例解析
- C++遺傳算法類文件實(shí)例分析
- C++實(shí)現(xiàn)迷宮算法實(shí)例解析
- C++實(shí)現(xiàn)漢諾塔算法經(jīng)典實(shí)例
- C++實(shí)現(xiàn)查找中位數(shù)的O(N)算法和Kmin算法
相關(guān)文章
Qt 使用 canon edsdk 實(shí)現(xiàn)實(shí)時(shí)預(yù)覽的示例代碼
這篇文章主要介紹了Qt 使用 canon edsdk 實(shí)現(xiàn)實(shí)時(shí)預(yù)覽的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11C++實(shí)現(xiàn)LeetCode(36.驗(yàn)證數(shù)獨(dú))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(36.驗(yàn)證數(shù)獨(dú)),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07Java3D實(shí)例之創(chuàng)建空間幾何模型的實(shí)現(xiàn)方法
本篇文章是對Java3D 創(chuàng)建空間幾何模型的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的介紹。需要的朋友參考下2013-05-05C++核心編程之占位參數(shù)和默認(rèn)參數(shù)
這篇文章主要介紹了C++核心編程之占位參數(shù)和默認(rèn)參數(shù),c++中函數(shù)的形參列表中的形參是可以有默認(rèn)值的,函數(shù)的形參列表里可以有占位參數(shù),用來占位,調(diào)用函數(shù)時(shí)必須填補(bǔ)位置。下面更多相關(guān)內(nèi)容的詳細(xì)介紹,需要的小伙伴可以參考一下2022-03-03QT5實(shí)現(xiàn)簡單的TCP通信的實(shí)現(xiàn)
本文主要介紹了QT5實(shí)現(xiàn)簡單的TCP通信的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05C++11 寫一個(gè)只觸發(fā)一次槽函數(shù)的Qt connect函數(shù)
這篇文章主要為大家介紹了C++11 寫一個(gè)只觸發(fā)一次槽函數(shù)的Qt connect函數(shù)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09C++如何實(shí)現(xiàn)簡單的計(jì)時(shí)器詳解
因?yàn)樽罱e著無聊就想著要不用C++寫點(diǎn)什么東西,仔細(xì)想了想其實(shí)自己的C++學(xué)的也不怎么好,寫個(gè)簡單的計(jì)時(shí)器吧!所以下面這篇文章主要介紹了利用C++如何實(shí)現(xiàn)簡單的計(jì)時(shí)器,需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01