2016-10-26 26 views
6

Phải thừa nhận rằng điều này có vẻ giống như một câu hỏi ngớ ngẩn, nhưng chịu đựng với tôi.Phần cuối của danh sách là gì?

Trong câu hỏi tôi được đưa ra liên quan đến Ngăn xếp, chúng tôi sẽ xác định hàm trả về mục "trên cùng" của ngăn xếp. Với tôi, tôi không biết bên nào là "hàng đầu" bởi vì thực sự, cả hai bên đều có thể.

Ngoài ra, tôi được đưa ra một câu hỏi liên quan đến Hàng đợi yêu cầu chúng tôi xác định hàm trả về mục "ở mặt trước" của hàng đợi. Một lần nữa, hai bên có thể được hiểu là "mặt trước"

Nếu câu hỏi được viết lại để yêu cầu "trả lại mục cuối cùng trong danh sách" hoặc "mục đầu tiên trong danh sách" này có ý nghĩa hoàn hảo, nhưng thật không may không phải vậy. Vì vậy, tôi muốn biết: có một định nghĩa cho cả hai "mặt trận" và "hàng đầu" về xếp chồng/hàng đợi mà về cơ bản chỉ là danh sách, hoặc là những thuật ngữ mơ hồ?

+0

tôi nghĩ anh ấy có nghĩa là giống như một danh sách để nhìn vào chuỗi con và bằng cách đầu tôi đặt cược họ có nghĩa là chỉ số 0 – thesonyman101

+0

Theo https://en.wikibooks.org/wiki/Data_Structures/Stacks_and_Queues, chỉ có 'một là kết thúc được gọi là đầu stack.' và 'mục ở phía trước của hàng đợi.', dường như không có sự mơ hồ nó – davedwards

+0

Nó rất tốt phụ thuộc vào cách bạn muốn nhìn vào nó. Đối với ai đó, phần trên cùng của ngăn xếp có thể là phần tử cuối cùng của danh sách (kể từ FIFO), vì vậy bất kỳ hoạt động 'pop()' nào có nghĩa là lấy phần tử được chèn gần đây nhất. Mặt khác, stack top có thể là phần tử đầu tiên, trong đó sau mỗi 'pop()' bạn đã điều chỉnh tất cả các phần tử tiếp theo ở bên trái bởi 1 vị trí. –

Trả lời

5

Có một định nghĩa cho cả hai "mặt trận" và "top" về đống/hàng đợi mà về cơ bản chỉ liệt kê hoặc là những điều khoản mơ hồ

Câu hỏi đặt ra là xây dựng trên một giả thuyết sai lầm, xếp chồng/hàng đợi đó là "về cơ bản chỉ là danh sách".

Hãy nhìn vào bức tranh này, trong đó cho thấy cách danh sách python được lưu trữ trong bộ nhớ (CPython)

it's a python list, dawg!

(nguồn ảnh: here)

Việc thực hiện thực sự là không có gì nhiều giống như một chồng hoặc hàng đợi và các đối tượng danh sách thực tế có thể ở khắp nơi trong bộ nhớ.

Stacks:

này ai khá rõ ràng: nếu ai đó nói về "top" của chồng, họ sẽ được đề cập đến mục mà gần đây nhất đã được thêm vào stack.Đó là mục bạn sẽ nhận được nếu bạn "bật" ra khỏi ngăn xếp.

Hàng đợi:

Điều này hơi cổ tích hơn một chút. Nếu ai đó đề cập đến mặt trước của hàng đợi, họ có thể có nghĩa là mặt hàng được thêm vào sớm nhất, vì hàng đợi thường được thực hiện "FIFO" (đầu tiên trong lần đầu tiên ra). Tuy nhiên, nó phụ thuộc vào việc thực hiện, ví dụ như cũng có một LIFO Queue trong python, mà đơn đặt hàng giống như một chồng. Để làm cho vấn đề tồi tệ hơn, cũng có deques (hàng đợi đôi) vì vậy bạn thực sự cần phải có thêm bối cảnh để hiểu được điều này một chút về thuật ngữ CS.

+0

Cảm ơn bạn có ý nghĩa. Tôi nên đã xem xét bản chất LIFO và FIFO. Nhưng tôi chắc rằng bạn có thể hiểu được tôi đến từ đâu khi nói rằng "top" và "front" khá mơ hồ. – oneman

+0

Theo ý kiến ​​của tôi, một chồng và một hàng đợi không giống nhau, như một danh sách. Đây là những cấu trúc khác nhau như một cái cây hay bất cứ thứ gì khác. Vì vậy, không có lý do để quyết định, mà cuối cùng của danh sách là đầu stack hoặc trước hàng đợi. Tất nhiên nó có thể hữu ích để thực hiện một ngăn xếp và một hàng đợi với một danh sách như cấu trúc cơ sở và chắc chắn rằng cuối danh sách có thể được ưu tiên hơn là ngăn xếp, nhưng việc thực hiện có thể làm điều đó, như muốn. Câu hỏi rất hữu ích, o.k. nhưng câu trả lời của tôi sẽ là: danh sách là các cấu trúc cơ bản khác và vì vậy chúng thực tế không có mặt trước, kết thúc hoặc đầu. – am2

+0

nghe có vẻ như lấy một tờ giấy trắng và hỏi, bên nào phải ở phía trên. Nếu bạn muốn vẽ bất cứ điều gì bạn sẽ xác định thực tế này, nhưng trước đó không có phía trên. – am2

5

Tôi nghĩ rằng, nói đúng, không phải kết thúc của một danh sách là đầu của một chồng/trước hàng đợi. Việc triển khai cấu trúc dữ liệu của bạn tách biệt với hành vi dự kiến ​​của cấu trúc dữ liệu.

Ví dụ: ngăn xếp thể hiện hành vi cuối cùng, trước hết (LIFO). Nói cách khác, phần tử cuối cùng được lưu trữ trong ngăn xếp là phần tử "trên cùng". Nếu bạn quyết định triển khai ngăn xếp của mình dưới dạng danh sách trong đó mọi phần tử mới được thêm vào chỉ mục 0 và tất cả các phần tử hiện có được chuyển sang 1, thì chỉ mục 0 sẽ là đầu của bạn. Mặt khác, nếu bạn triển khai ngăn xếp của mình dưới dạng danh sách trong đó mọi phần tử mới được nối vào cuối danh sách, thì chỉ mục -1 sẽ là đầu của bạn.

Do đó, việc triển khai trước đây khá kém hiệu quả bởi vì mỗi khi bạn đẩy/bật giá trị, bạn phải thay đổi toàn bộ danh sách, trong khi việc triển khai sau hiệu quả hơn vì bạn chỉ cần thêm/xóa các phần tử đến/từ cuối danh sách.

Ngoài ra, chỉ để chỉ ra điều gì đó được đề cập trong các câu trả lời/nhận xét khác mà tôi không nói rõ ràng, việc triển khai của bạn cũng không phải là danh sách. Khi tôi nói rằng việc thực hiện và hành vi là riêng biệt, điều đó cũng đi cho cấu trúc dữ liệu cơ bản.

1

Tùy thuộc vào cách bạn đang thêm vào danh sách. Nếu bạn làm như vậy,

stack = [] 
numbers = [1, 2, 3, 4, 6, 5] 
for n in numbers: 
    stack.append(n) 
print(stack) 

Sau đó, "đầu" của ngăn xếp là kết thúc. Khi thêm từ phía trước của danh sách, thì mặt trước hoặc chỉ mục 0 là trên cùng. Đây là một ví dụ cho một máy tính.

addStack = [] 
curNumber = 0 
while True: 
    n = raw_input("Enter a number or operation.") 
    if n.isdecimal(): 
    addStack.append(int(n)) 
    if n == "=": 
    print("Top number(or last number entered): %i" % (
Các vấn đề liên quan