Array ve Stack arasındaki fark nedir?


10

Wikipedia'ya göre bir yığın :

son giren ilk çıkar (LIFO) soyut veri türü ve doğrusal veri yapısıdır.

Bir dizi varken :

her biri en az bir dizi dizini veya anahtarı ile tanımlanan bir öğe koleksiyonundan (değerler veya değişkenler) oluşan bir veri yapısıdır.

Anladığım kadarıyla, oldukça benzerler. Peki, ana farklar nelerdir? Aynı değilse, bir yığının yapamayacağı bir dizi ne yapabilir?


5
Sorunuz Wikipedia'da bulduğunuz soruya nasıl cevap vermiyor? Bir dizinin öğelerine istediğiniz sırayla erişebilirsiniz; bir yığına LIFO sırayla erişilmelidir.
Caleb

8
@Caleb Bir şeyi okuduğunuz için kavramı anladığınız anlamına gelmez. Aklımda, bunu sorana kadar tam olarak anlamadım.
Dinamik

3
-1 Temel olarak cevabı kendi sorunuza gönderdiniz. Tekrar ne soruyorsun?
Andres F.

1
@AndresF. Bunun ne anlama geldiğini anlayamıyorum ... Bir Wikipedia makalesine bakıp ilk ne söylediklerini anlayabilseydiniz, dünya mükemmel olurdu.
Dinamik

2
Meta.programmers'ı yeni okudum ve neden bu soruyu sorduğunuzu anladım: bu bir yarışma için. Wikipedia makalesini anlamadığınızdan şüpheliyim. Yazıklar olsun: /
Andres F.

Yanıtlar:


45

Kesinlikle bir dizi ile bir yığın uygulayabilirsiniz. Aradaki fark erişimdedir. Bir dizide, bir öğe listeniz vardır ve bunlardan herhangi birine istediğiniz zaman erişebilirsiniz. (Üst üste yerleştirilmiş bir grup tahta blok düşünün.)

Ancak yığın halinde rastgele erişim işlemi yoktur; Orada sadece Push, Peekve Popbunların hepsi yığının üstündeki elemanı ile özel anlaşma. (Şimdi tahta blokları dikey olarak yığılmış olarak düşünün. Kulenin tepesinin altındaki hiçbir şeye dokunamazsınız yoksa düşecektir.)


11
tahta bloklar - güzel benzetme
Jesse Black

1
"Yığında, rasgele erişim işlemi yok" diyorsunuz ama katılmıyorum ve cevabımda daha fazla ayrıntı ekleyeceğim.
Scott Whitlock

yığınlar kesinlikle rasgele erişimle uygulanır
old_timer

4
Jenga'ya emmek zorundasın.
Hoşnutsuz Keçi

1
@Mason, biliyorum. Şakaydı.
Hoşnutsuz Keçi

6

Saf bir yığın olarak, sadece izin verilen operasyonlardır Push, Popve Peekancak pratik açıdan, bu tam olarak doğru değil. Daha doğrusu, Peekişlem genellikle yığındaki herhangi bir konuma bakmanıza izin verir, ancak yakalama, yığının bir ucuna göre olmasıdır.

Yani, diğerlerinin söylediği gibi, bir dizi rastgele erişimdir ve her şey dizinin başlangıcına atıfta bulunur .

Bir yığında, yalnızca yığının çalışma ucuna ekleyebilir / kaldırabilirsiniz, ancak yine de rasgele erişime sahip olursunuz, ancak çalışma ucuna başvurulur . Temel fark budur.

Örneğin, bir yığındaki parametreleri bir işleve ilettiğinizde, callee'nin parametrelere bakmak için parametreleri atması gerekmez. Sadece yığındaki yerel değişkenleri iter ve yığın işaretçisinden bir ofsete dayalı olarak tüm yerel değişkenlere ve parametrelere başvurur. Sadece bir dizi kullanıyorsanız, callee parametrelerini nerede arayacağını nasıl bilebilir? Çağrı tamamlandığında, yerel değişkenlerini çıkarır, bir dönüş değeri iter, kontrolü arayana döndürür ve arayan dönüş değerini (varsa) ve daha sonra parametreleri yığından çıkarır. İşin güzelliği, işlev çağrılarınıza ne kadar iç içe olursanız olun (yığın alanınız kalmadığı varsayılarak) çalışır.

Bu belirli bir kullanım / uygulamadır, ancak farkı gösterir: diziye her zaman en baştan başvurulur, ancak yığınlara her zaman çalışan bir son konumdan başvurulur.

Bir yığının olası bir uygulaması , çalışma dizisinin nerede olduğunu hatırlamak için bir dizi artı bir dizindir.


Bana göre cevap bu. Bir dizi ve bir yığın arasındaki farkın ne olduğu sorusu, dizi daha az kısıtlanmış ve çok yönlü göründüğünde neden yığına ihtiyacımız olduğuna iner. Ve buna cevap veriyor: bunun nedeni, yığının uygun durumlarda (örneğin burada işlev çağrıları) kullanılmasının makineyi mantıklı hale getirmesidir. Henco "güzellik"
Todanley

4

Bence burada yaşanan en büyük karışıklık, temel veri yapılarına karşı uygulama.

Çoğu (daha temel dilde) dizi, belirli bir zamanda erişebileceğiniz sabit uzunluklu bir öğe kümesini temsil eder. Bunun gibi bir sürü öğeye sahip olmanız, size nasıl kullanılması gerektiği hakkında hiçbir şey söylemez (ve açıkçası bir bilgisayar, kullanımı ihlal etmediği sürece nasıl kullandığınızı bilemez / umursamaz).

Yığın, belirli bir şekilde ele alınması gereken verileri temsil etmek için kullanılan bir soyutlamadır. Bu soyut bir kavramdır, çünkü sadece üste ekleyebilen veya üstten kaldırabilen bazı alt rutin / yöntem / fonksiyona sahip olması gerektiğini söylerken, üstteki verilere dokunulmaz. Tamamen bu şekilde bir dizi kullanmak için seçim.

Birçok farklı veri yapısından bir yığın oluşturabilirsiniz: diziler (bazı maksimum boyutlarda), dinamik diziler (alan dışındayken büyüyebilir) veya bağlantılı listeler. Şahsen, bağlantılı bir listenin, ilk öğenin ötesindeki şeyleri görmek için biraz çaba harcamak zorunda olduğunuz için bir yığının kısıtlamalarını en iyi şekilde temsil ettiğini hissediyorum ve ön tarafa eklemek ve önden kaldırmak çok kolaydır.

Yani bir yığın yapmak için bir dizi kullanabilirsiniz, ancak bunlar eşdeğer değildir


3

Sorumlulukları farklıdır:

  • Yığın öğeleri yığının üzerine getirebilmeli ve öğeleri yığından kaldırabilmeli, bu yüzden normalde neden yöntemleri Pop()vePush()

  • Dizinin sorumluluğu belirli bir dizinde öğe almak / ayarlamaktır


3

A \ dizisinin herhangi bir dizininden bir öğe alabilirsiniz.

Yığında, başka bir yığın kullanarak A yığının ortasındaki bir öğeyi alabilirsiniz: B

İstediğiniz A ürününe gelene kadar üst öğeyi A'dan çıkarmaya ve B'ye koymaya devam edersiniz, sonra B'den öğeleri A yığının üstüne geri koyarsınız.

Bu nedenle, rastgele bir dizin alma yeteneğini gerektiren veriler için, yığının çalışması daha zordur.

"Son giren ilk çıkar" davranışını istediğiniz durumda, bir yığın size bir diziden daha az ek yük verir.


0

"Çok benzer" olduklarını söyleyecek kadar ileri gitmem.

Bir dizi, daha sonra sıralı olarak veya dizin üzerinden erişilecek şeyleri tutmak için kullanılır. Veri yapısı herhangi bir erişim yöntemi (FIFO, LIFO, FILO, vb.) Anlamına gelmez, ancak isterseniz bu şekilde kullanılabilir.

Bir yığın, yaratıldıkları şeyleri izlemenin yoludur. Oluşturulan yığının türüne bağlı olarak bir erişim yöntemi ima edilir / gerekir. Bir çerçeve yığını bir LIFO örneği olacaktır. Feragatname - Veri yapısı sınıflandırmamı burada karıştırıyor olabilirim ve bir yığın gerçekten sadece LIFO'ya izin verebilir. Aksi takdirde farklı bir kuyruk türü olur.

Bu yüzden (ben istemezdim) bir yığın olarak bir dizi kullanabilirsiniz ama (ben gerçekten çok çalışmadıkça) bir dizi olarak bir yığın kullanamazsınız.


1
'Nesne koleksiyonlarını saklamak için yapılar' alanında çok benzer olduklarını söyleyemem. Programlama kavramları alanında, oldukça benzer olduklarını söyleyebilirim. Genel olarak bir şeyler alanında neredeyse aynı olduklarını söyleyebilirim.
Kirk Broadhurst

0

Bir dizideki verilere bir anahtar veya dizin ile erişilebilir. Bir yığındaki verilere, yığının üst kısmından çıkarıldığında erişilebilir. Bu, dizini biliyorsanız bir diziden verilere erişmenin kolay olduğu anlamına gelir. Bir yığındaki verilere erişmek, aradığınız öğeyi bulana kadar öğeleri açmaya devam etmeniz gerektiği anlamına gelir, yani veri erişimi daha uzun sürebilir.


0

Bir dizi programcıların bakış açısından, yerinde ve boyutta sabittir, içinde nerede olduğunuzu ve her şeyin nerede olduğunu bilirsiniz. Hepsine erişiminiz var.

Bir yığınla, bir ucunda oturuyorsunuz, ancak boyutu veya güvenli bir şekilde ne kadar ileri gidebileceğinizi bilmiyorsunuz. Buna erişiminiz tahsis ettiğiniz miktarla sınırlıdır, sadece yığın veya program alanına çarptıysanız istediğiniz miktarı tahsis edip etmediğinizi bile bilmezsiniz. Bir yığına bakışınız, kendinize ayırdığınız küçük bir dizidir, istediğiniz büyüklükte, kontrolünüz vardır ve görebilirsiniz. Bölümünüz bir diziden farklı değil. Farkınız, görüşünüzün olmadığı, ne kadar büyük veya küçük olduğu hakkında hiçbir fikriniz olmadığı ve muhtemelen zarar vermeden dokunamayacağınız argüman ve terminoloji uğruna başka bir dizinin bir ucuna yapıştırılır. Genel olarak bir dizi, yığın üzerinde yine de uygulanır, bu nedenle dizi ve yığın, bu işlev süresince aynı alanı paylaşır.

Donanım tarafına girmek istiyorsanız, elbette işlemciye özgüdür, ancak genellikle dizi bilinen bir başlangıç ​​noktası / adrese dayanır, boyut derleyici / programcı tarafından bilinir ve adresler hesaplanır, bazen kayıt ofseti adresleme kullanarak (bu temel kayıt değeri tarafından tanımlanan adresten bir değer yükleyin ve bu ofset kayıt değeri, aynı şekilde derlendiğinde, zorunlu olarak kayıt temelli olması gerekmeyen derhal bir ofset olabilir, elbette işlemciye bağlıdır) yüksek seviye kodunda bir diziye erişmeye benzer. Yığınla benzer şekilde, varsa, genellikle yığın işaretçisinin kendisi veya bunun için yığın çerçevesine erişmek için kullanılacak derleyici / programcı tarafından ayrılan özel bir kayıt kullanıyor olsa da, kayıt veya anında ofset adresleme kullanabilirsiniz. işlevi. Bazı işlemciler için, yığına erişmek için özel yığın erişim işlevleri kullanılır ve / veya gereklidir. Push ve pop talimatlarınız var, ancak düşündüğünüz kadar sık ​​kullanılmıyor ve bu soruya gerçekten başvurmuyorlar. Bazı işlemciler için push ve pop, yalnızca yığındaki yığın işaretçisini değil, herhangi bir kayıtla, herhangi bir yerde, herhangi bir kayıtla kullanılabilecek talimatlar için takma adlardır ve bu soruyla ilgili itme ve pop'u daha da kaldırırlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.