C# Queue uses Circular buffer internally. Using linear array or list is inefficient. Therefore Circular Buffer/ Circular array can be used to implement Queue. Also, Queue can be implemented using Linked List. Similaryly, Stack implementation can use Circular buffer or linked lists.
HashTable uses collision detection and collision avoidance to prevent collision of items inserted to it. HashTable uses linear probing and quadratic probing to do this. Linear probing works as following, while inserting an element to a hashtable, item’s hashcode is being calculated. if there is already an item with the same hashcode in the hastable, next item to the existing item is checked. if it s empty new item is inserted there. So it checks one item at a time next to the existing item until there is an empty spot. Quadratic probing work with squaring the element position and inserting the available spot. N + 1*1 , N + 2*2 , N+3*3 and so on.
Dictionary uses chaining for hashcode collision. This is one of the other difference between hashtable and dictionary the other being generics. Chaining doesnt work like probing, instead of searching for an available slot, collided item is chained, attached to the existing item using a linked list (another data structure). Moreover, dictionary is much more efficient than stack, queue or list because of expansion strategy. While list doubles the size of the internal structure when it needs to resize, dictionary uses the next big prime number. Moreover, while inserting items to dictionary order is discarded, unlike list, queue or stack. Seaching for an element in dictionary is constant time O(1). where as in list or array, it takes linear time O(n). Therefore dictionaries are very efficient.
Moreover, Dictionaries can be used to compress, compact data and save memory. such as Huffman encoding.