» »

[c#] Sklad

[c#] Sklad

Cvenemir ::

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Povecaj(Stack<int> skl, Stack<int> pomozni_skl)
        {
            while (skl.Count != 0)
            {
                pomozni_skl.Push(skl.Pop() + 1);
            }
            while (pomozni_skl.Count != 0)
            {
                skl.Push(pomozni_skl.Pop());
            }

            foreach (int vrednost in skl)
            {                
                Console.WriteLine("{0}", vrednost);
            }
                       
        }
        static void Main(string[] args)
        {
            Stack<int> skl = new Stack<int>();
            Stack<int> pomozni_skl = new Stack<int>();

            skl.Push(1);
            skl.Push(2);
            skl.Push(3);
            skl.Push(4);
            skl.Push(5);

            Povecaj(skl, pomozni_skl);
            
            Console.ReadKey(true);
        }
    }
}

Kako naj priredim metodo Povecaj(), da pri izpisu vrstni red števil ne bo zamenjan? Uporabim pa lahko samo en pomozni sklad.

darkolord ::

foreach čez stack seveda ne gre po vrsti, ampak v obratnem vrstnem redu, enako kot Pop(). Vrednost lahko izpišeš v prejšnji zanki.

Cvenemir ::

Deluje, hvala :)

Cvenemir ::

Se eno vprašanje. Tule morem pa z uporabo sklada obrnat podan seznam.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Obrni_seznam
{
    class Program
    {
        public static void Obrni(LinkedList<int> seznam, Stack<int> obrnjeno, Stack<int> temp)
        {
            foreach (int stevilo in seznam)
            {
                temp.Push(stevilo);
            }

            foreach (int stevilo in temp)
            {
                int a = temp.Pop();
                obrnjeno.Push(a);
                Console.WriteLine(a);
            }
        }

        static void Main(string[] args)
        {
            LinkedList<int> seznam = new LinkedList<int>();
            Stack<int> temp = new Stack<int>();
            Stack<int> obrnjeno = new Stack<int>();

            seznam.AddLast(1);
            seznam.AddLast(2);
            seznam.AddLast(3);
            seznam.AddLast(4);
            seznam.AddLast(5);

            Obrni(seznam, obrnjeno, temp);
            Console.WriteLine(obrnjeno);
            Console.ReadKey(true);
        }
    }
}

Do tegale sm pršu, ampak mi meče napako "Collection was modified after the enumerator was instantiated." pri drugi foreach zanki v metodi Obrni().

Spura ::

Ce spreminjas podatkovno strukturo postanejo vsi trenutno odprti enumeratorji invalid.

mihies ::

Spura ima prav. Zakaj sploh potrebuješ tole:
foreach (int stevilo in temp)


Daj raje for zanko od 0 to temp.Count-1

Spura ::

mihies je izjavil:

Spura ima prav. Zakaj sploh potrebuješ tole:
foreach (int stevilo in temp)


Daj raje for zanko od 0 to temp.Count-1

Taka for zanka ne bo delovala.
V primeru, da ima sklad "temp" 10 elementov se bo izvedla le 5-krat, ker se temp.Count vsako iteracijo zmanjsa za eno.

Pravilna je uporaba while zanke:

while(!temp.isEmpty()) { // ne vem ce C# ima empty na stacku, ce nima napisi temp.Count != 0 kot pogoj
obrnjeno.push(temp.pop);
}


V splosnem ljudje prevec uporabljajo for zanke in premalo while zanke.

Zgodovina sprememb…

  • spremenil: Spura ()

mihies ::

Ooops, Spura ima prav. Zanka bi morala biti od Count-1 do 0. Rešitev z IsEmpty je še lepša.

Spura ::

Pa ne rabis dveh stackov da obrnes. Stack je LIFO struktura in itak obrne vrstni red. Ta tvoja koda ti v "obrnjeno" da isti vrstni red kot je v podanem seznamu.

Spura ::

Pa nehi ga srat s temi void funkcijami. Predpostavljam, da bi ti dejansko moral vracat List z obrnjenim vrstnim redom.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Obrni_seznam
{
    class Program
    {
        public static LinkedList<int> Obrni(LinkedList<int> seznam)
        {
            Stack<int> stack = new Stack<int>();
            LinkedList<int> ret = new LinkedList<int>();
            foreach (int stevilo in seznam)
            {
                stack.Push(stevilo);
            }
            foreach (int stevilo in stack)
            {
                ret.AddLast(stevilo);
            }
            return ret;
        }

        static void Main(string[] args)
        {
            LinkedList<int> seznam = new LinkedList<int>();
            seznam.AddLast(1);
            seznam.AddLast(2);
            seznam.AddLast(3);
            seznam.AddLast(4);
            seznam.AddLast(5);
            LinkedList<int> obrnjeno = Obrni(seznam);
            Console.WriteLine(obrnjeno);
            Console.ReadKey(true);
        }
    }
}

Zgodovina sprememb…

  • spremenil: Spura ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[c#] Ustvarjanje objekta v drugem razredu

Oddelek: Programiranje
81648 (1593) Cvenemir
»

c sharp LinkedList - Naloga

Oddelek: Programiranje
91841 (1792) Msatir
»

Povezani seznam

Oddelek: Programiranje
132086 (1683) pohano
»

[c#] LinkedList branje poljubnega elementa

Oddelek: Programiranje
161537 (1446) FrEaKmAn
»

c# LinkedList iterator

Oddelek: Programiranje
5782 (667) Mitja Bonča

Več podobnih tem