队列和栈

队列  :先进先出,元素将在队列的尾部插入(入队,或者Enqueue),并从队列的头部移除(出对,或者Dequeue)。

栈:后进先出,元素在顶部入栈(push),也从顶部出栈(pop)。

eg:

Queue

using System;

using  System.Collections;

...

Queue numbers = new Queue();

...

//填充队列

foreach (int number in new int[4]{4,5,6,7})

{

      numbers.Enqueue(number );

      Console.WriteLine(number  + " has joined the queue");

}

...

//遍历队列

foreach (int number in numbers)

{

      Console.WriteLine(number);

}

......

//清空队列

while (numbers.Count >0)

{

      int number = (int )numbers.Dequeue();

      Console.WriteLine(number  + " has left the queue");

}

代码输出如下


3  has left the queue

4 has left the queue

5 has left the queue

6 has left the queue

3

4

5

6

3  has left the queue

4 has left the queue

5 has left the queue

6 has left the queue


Stack //栈

using System;

using  System.Collections;

...

Stack numbers = new Stack();

...

//填充栈  -  入栈  

foreach (int number in new int[4]{4,5,6,7})

{

      numbers.Push(number );

      Console.WriteLine(number  + " has been pushed on the stack");

}

...

//遍历栈

foreach (int number in numbers)

{

      Console.WriteLine(number);

}

......

//清空栈 - 出栈

while (numbers.Count >0)

{

      int number = (int )numbers.Pop();

      Console.WriteLine(number  + " has been popped off the stack");

}


代码输出如下

3 has been pushed on the stack

4 has been pushed on the stack

5 has been pushed on the stack

6 has been pushed on the stack

6

5

4

3

6 has been popped off the stack

5 has been popped off the stack

4 has been popped off the stack

3 has been popped off the stack




### 队列的数据结构及其与指针的关系 #### (Stack) 是一种线性数据结构,遵循 **后进先出(LIFO, Last In First Out)** 的原则。这意味着最后被压入中的元素最先弹出。 - 可以通过数组或链表实现[^1]。 - 如果使用数组实现,则需要维护一个指向顶的索引变量 `top`。当执行压操作时,增加该索引;执行弹操作时,减少该索引。 - 若通过链表实现,则可以利用指针来管理节点之间的连接关系。在这种情况下,顶通常由一个指向当前顶部节点的指针表示。每次压时创建新节点并将指针更新到这个新节点上;而弹则涉及修改指针使其指向下一个节点并释放旧的顶部节点内存。 ```c typedef struct StackNode { int data; struct StackNode* next; // 指向下一个节点的指针 } StackNode; // 压函数示例 void push(StackNode** top_ref, int new_data) { StackNode* new_node = malloc(sizeof(StackNode)); if (!new_node) { /* handle error */ } new_node->data = new_data; new_node->next = *top_ref; *top_ref = new_node; } ``` #### 队列 (Queue) 队列也是一种线性数据结构,但它遵循的是 **先进先出(FIFO, First In First Out)** 的原则。即最早进入队列的元素会被优先移除。 - 类似,队列同样可以用数组或者链表两种方式构建[^2]。 - 当采用链表形式实现时,队列至少需要两个指针分别记录头部 (`front`) 尾部 (`rear`) 节点的位置。这样做的好处在于能够高效地完成两端的操作——在队首删除元素以及在队尾添加新的元素都不会影响其他部分的时间复杂度。 ```c typedef struct QueueNode { int data; struct QueueNode* next; // 下一节点地址存储区域 } QueueNode; // 入队操作实例代码片段 void enqueue(struct QueueNode** rear_ref, int item){ QueueNode* temp = malloc(sizeof(QueueNode)); if(!temp){/*处理分配失败情况*/} temp->data=item; temp->next=NULL;// 新加入项作为最后一个结点 if(*rear_ref==NULL)//如果是空列表的话直接赋值给前后端即可 front=*rear_ref=temp; else{ (*rear_ref)->next=temp; *rear_ref=temp;} } ``` #### 关于指针使用的总结 无论是对于还是队列,在基于链表的实际应用过程中都需要频繁运用到指针的概念来进行动态内存管理对象间链接控制: - 对于而言,主要体现在如何调整指向最新堆叠层位置的那个唯一外部引用; - 至于队列方面,则更加注重保持好起始读取入口处(`front`)同结束写入出口侧(`rear`)两者独立却又相互关联的状态同步机制之上。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值