ZBLOG

一个C语言代码,快速获取栈中元素,实现栈的基本操作:获取栈中最小元素(getMin)方法。要保证该方法的时间复杂度是O(1)。

要实现栈的基本操作,并且在O(1)的时间复杂度内获取栈中最小元素,可以借助辅助栈来实现。

首先,我们创建两个栈:原始栈和辅助栈。原始栈用于存储所有的元素,辅助栈用于存储当前最小元素。

在插入元素时:

  1. 将元素同时压入原始栈和辅助栈。
  2. 如果插入的元素小于等于辅助栈顶部元素,则将该元素也压入辅助栈。否则,不进行任何操作。

在删除元素时:

  1. 从原始栈弹出一个元素。
  2. 如果该元素等于辅助栈顶部的元素,则同时从辅助栈中弹出一个元素。

这样,每次操作后,辅助栈的顶部元素就是当前最小值。

以下是C语言代码示例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. // 定义节点结构
  4. typedef struct Node {
  5. int value;
  6. struct Node* next;
  7. } Node;
  8. // 定义堆栈结构
  9. typedef struct Stack {
  10. Node* top;
  11. } Stack;
  12. // 初始化堆栈
  13. void initStack(Stack* stack) {
  14. stack->top = NULL;
  15. }
  16. // 压入堆栈
  17. void push(Stack* stack, int value) {
  18. Node* newNode = (Node*)malloc(sizeof(Node));
  19. newNode->value = value;
  20. // 将节点插入堆栈顶部
  21. newNode->next = stack->top;
  22. stack->top = newNode;
  23. }
  24. // 弹出堆栈
  25. int pop(Stack* stack) {
  26. if (stack->top == NULL) {
  27. printf("Stack is empty.\n");
  28. return -1; // 返回一个非法值作为错误标志
  29. }
  30. Node* topNode = stack->top;
  31. int value = topNode->value;
  32. // 更新堆栈顶部指针并释放节点内存
  33. stack->top = topNode->next;
  34. free(topNode);
  35. return value;
  36. }
  37. // 获取栈中最小元素(O(1)复杂度)
  38. int getMin(Stack* stack) {
  39. if (stack->top == NULL) {
  40. printf("Stack is empty.\n");
  41. return -1; // 返回一个非法值作为错误标志
  42. }
  43. return stack->top->value; // 辅助栈的顶部元素即为当前最小值
  44. }
  45. int main() {
  46. Stack originalStack, auxiliaryStack;
  47. // 初始化两个栈
  48. initStack(&originalStack);
  49. initStack(&auxiliaryStack);
  50. // 向原始栈中压入一些元素(示例)
  51. push(&originalStack, 5);
  52. push(&originalStack, 2);
  53. push(&originalStack, 7);
  54. push(&originalStack, 4);
  55. // 遍历原始栈,将辅助栈更新为当前最小值的序列
  56. Node* currentNode = originalStack.top;
  57. while (currentNode != NULL) {
  58. int value = currentNode->value;
  59. // 如果当前值小于等于辅助栈顶部的值,则将其压入辅助栈
  60. if (auxiliaryStack.top == NULL || value <= auxiliaryStack.top->value) {
  61. push(&auxiliaryStack, value);
  62. }
  63. currentNode = currentNode->next;
  64. }
  65. // 打印栈中最小元素
  66. printf("The minimum element in the stack is: %d\n", getMin(&auxiliaryStack));
  67. return 0;
  68. }

这个示例代码展示了如何通过辅助栈实现获取栈中最小元素的操作,并保证了O(1)的时间复杂度。你可以根据需要自定义其他栈操作和测试样例。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9491

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?