Обединяване на подредени редици от числа

Да се позволи въвеждането на две редици от по N цели числа, подредени в нарастващ ред. Да се изведе обединената редица, съдържаща всички числа от двете редици, отново подредени по нарастващ ред.

По желание: Да се реши задачата, ако не е известно колко числа има в първите две редици.

Публикувано в 12в с етикети . Постоянна връзка.

2 Responses to Обединяване на подредени редици от числа

  1. kaloyan каза:
    #include <cstdlib>
    #include <iomanip>
    #include <iostream>
         
    using namespace std;
         
    // максимален брой елементи в опашката
    const int N=50;
         
    struct opashka {
        // указател към върха на опашката
        int head = 0;
        // указател към края на опашката
        int tail = 0;
        // масив за съхранение на елементите на опашката
        int s[N];
    };
     
    // инициализиране на опашката
    void init(opashka &q)
    {
        q.head=0;
        q.tail=0;
        for(int i=0;i<=N;i++) q.s[i]=0;
    }
         
    // проверка дали опашката е празна
    bool isEmpty(const opashka &q) {
        return q.head==q.tail;
    }
         
    // проверка дали опашката е пълна
    bool isFull(opashka &q) {
        return ((q.tail+1)%N)==q.head;
    }
         
    // запис на стойност в опашката
    bool push(int X, opashka &q)
    {
        bool ok = !isFull(q);
        if (ok){
            q.s[q.tail] = X;
            q.tail++;
            q.tail%=N;
        }
        return ok;
    }
         
    // извличане на стойност от опашката
    bool pop(int &X, opashka &q)
    {
        bool ok = !isEmpty(q);
        if (ok) {
            X = q.s[q.head];
            q.head++;
            q.head%=N;
        }
        return ok;
    }
         
    int main ( ) {
    opashka a,b,c;
    // инициализираме опашките
    init(a);
    init(b);
    init(c);
    
    int x;
    int y;
    
    cout<<"Vavedi stoinostite na purvata opashka(0 za krai)"<<endl;
    do{
    	cin>>x;
    	if(x==0) break;
    	push(x,a);
    } while(true);
    
    cout<<"Vavedi stoinostite na vtorata opashka(0 za krai)"<<endl;
    do{
    	cin>>x;
    	if(x==0) break;
    	push(x,b);
    } while(true);
    
    
    bool pushed_x=true, pushed_y=true;
    
    while(!isEmpty(a) || !isEmpty(b)){	
    	if(!isEmpty(a)) 
    		if(pushed_x) pop(x,a);
    			
    	if(!isEmpty(b))
    		if(pushed_y) pop(y,b);
    	
    	if(x!=0 && y!=0)
    		if(x<y){
    			push(x,c);
    			x=0;
    			pushed_x=true;
    			pushed_y=false;
    			
    		} else {
    			push(y,c);
    			y=0;
    			pushed_y=true;
    			pushed_x=false;
    		}
    	else
    	if(x!=0 && y==0) {
    		push(x,c);
    		pushed_x=true;
    		pushed_y=false;
    	} else
    	if(x==0 && y!=0) {
    		push(y,c);
    		pushed_y=true;
    		pushed_x=false;
    	}
    }
    
    /*
    Ако е останало число, което не е добавено към опашка C, 
    обаче опашка A и B са празни(цикъла по-горе няма да се 
    изпълни) - тук го добавяме
    */
    if(!pushed_x && x!=0) push(x,c);
    if(!pushed_y && y!=0) push(y,c);
    
    
    cout<<endl;
    while(!isEmpty(c)){
        pop(x, c);
        cout<<x<<endl;
    }
     
    cout<<endl;
    return 0;
    }
    • Данаил каза:

      Браво – избрал си да реализираш и допълнителното условие :-) Хубаво си се сетил, че опашките няма как да съдържат 0 и че едната може доста да изчаква другата. Но ти е ненужно усложнен кода и няма коментари – ще го дообсъдим в часа.

Вашият коментар