2011-11-13 3 views
0

내 숙제는 묻는다 : 설정C++ 사용하여 STL : 스택과 큐

어느 날의 데이터가 퍼스트 클래스에 파일 lot.txt에서 사용할 수 있습니다.

도착/출발 코드 : 문자 (A 또는 D) 라이선스 문자열 (. 예 BOSS) 시간 정수 값 군사 시간

인 Earlybird 630 노동자 700 CEO 730 서기 730 관리자를 나타내는 800 VP 900 D 서기 930 구매자 1,000 D의 CEO 1,000 D의 인 Earlybird 1,030 D WORKER 1,100 청소부 1,100 D의 MANAGER 1,130

차량이 라이센스와 도착 시간을 포함하는 구조체로서 기록되어야한다. 단순화를 위해, 시간은 군대 시간을 나타내는 정수 이 될 것입니다. C++ 문자열 클래스를 포함하십시오.
구조체 Vehicle {string license; // 라이센스 값 int 도착; // 군사 시간 도착 (0 - 2359)};

데이터 파일의 라인을 읽고 주차장 내외부에있는 차량 의 움직임을 다시 만듭니다. 차량은 체류 기간 동안 시간당 $ 8.00로 청구됩니다. 부분 시간은 반올림됩니다. 너 은 많은 사람들이 출발하는 자동차의 소유자 만이 도착한다고 가정 할 수 있습니다. . 주말에 많은 차량을 신고하고 요금을 합산합니다. 강의에서 템플릿 스택과 대기열 클래스 인 을 사용하십시오. 당신이보고해야 처리 된 각 도착

: 라이센스 XXXXXX와 XXXX 또는 자동차에 주차 라이센스 XXXXXX 와 자동차가 XXXX에서 외면했다 - 특별 가득! 각각 신고해야 처리 출발

: 라이센스 XXXXXX와 자동차가 나는 부분을 차 잎에 문제가있어 $ XX.XX

지불 XXXX에서 왼쪽으로. 나는 스택과 큐에 익숙하지 않지만 스택을 이해하고 스택은 LIFO이고 큐는 FIFO이다. 여기

내가 무엇을 가지고 :

struct Vehicle 
    { 
     char ad; // Arrival departure char 
     string license; // license value 
     int arrival; // arrival in military time 
    }; 

    int main() 
    { 
     ifstream fin;   // declare input file stream object 
     fin.open ("lot.txt"); //open data text 
     stack<string> stack; // STL Stack object 
     queue<string> q; // STL Queue object 

     Vehicle v; // Object of struct Vehicle 

     while(!fin.fail()){ 
      fin >> v.ad >> v.license >> v.arrival; 
      if (v.ad == 'A' && stack.size() < 5){ 
       stack.push(v.license); 
       cout << endl << "Car with license " << v.license << " parked at " << v.arrival; 
      }else if(v.ad == 'A' && stack.size() >= 5){ 
       cout << endl << "Car with license " << v.license << " turned away at " << v.arrival << " - LOT FULL"; 
      }else if(v.ad == 'D'){ 
       string departingcar = v.license; 

       for(int i=0; i<stack.size(); i++) 
//am I on the right track with a for loop? 
        q.push(v.license); 
        stack.pop(); 
        q.pop(); 
        if(departingcar != v.license){ 
         stack.push(v.license); 
        } 
       } 

      } 
     } 
     return 0; 
    } 

나는 아무 문제의 차량을 읽을 수 있지만, 스택에서 차량을 제거 큐에 넣어, 그리고 다음에 그들을 다시 삽입해야 할 때 스택, 나는 길을 잃는다.

+0

교수님이 정말로 'lol.txt'와 같은 이름을 사용합니까? –

+0

'lot.txt' 여야합니다. – Nick

답변

1

현재 for 루프는 대기열에 항목을 추가 한 직후부터 의미가 없습니다. 맨 앞에있는 요소는 팝업으로 표시하고 다른 곳에서는 저장하지 않으므로 영원히 잃어 버리게됩니다.

나는 당신이 여기서하려고하는 것은 스택에 삽입 된 차를 찾아서 제거하는 것이라고 가정하고있다. 그렇다면, 다음과 같은 일을 할 경우

string departingcar = v.license; 

//find and remove the license plate from the stack 
for(int i=0; i<stack.size(); i++) 
{ 
    if (departingcar != stack.top()) 
    { 
     q.push(stack.top()); 
     stack.pop(); 
    } 
    else 
    { 
     stack.pop(); 
     break; 
    } 
} 

//put the remaining cars back in the stack and empty out the queue 
while(!q.empty()) 
{ 
    stack.push(q.front()); 
    q.pop(); 
} 

그래서 기본적으로 여기에 무슨 일이 일어나고 있는지 우리가 출발하는 차의 번호판 같지 않은 큐에 자동차를 추가하는 것입니다.우리가 제거하고 싶은 차에서 번호판을 만난다면 우리는 단순히 그것을 대기열에 추가하지 않고 스택에서 제거합니다. 차를 찾았으므로 for-loop를 빠져 나옵니다. 다음으로, 이전에 스택에서 제거한 자동차를 다시 스택으로 밀어 넣어 대기열을 비워두기 만하면됩니다.

+0

감사합니다! 이것은 내가 가지고 있던 문제를 해결합니다. – Nick