链表实现栈

Posted hemeiwolong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表实现栈相关的知识,希望对你有一定的参考价值。

题目来源:LeetCode739

  1 // 链表节点
  2 typedef struct Node {
  3     int value;    // 气温
  4     int index;    // 下标
  5     struct Node *next;
  6 } pNode;
  7 
  8 //
  9 typedef struct MyStack {
 10     pNode *top;
 11 } pMyStack;
 12 
 13 /**
 14 * @brief 创建栈
 15 * @return 指向栈的指针
 16 */
 17 pMyStack* CreateStack()
 18 {
 19     pMyStack *temp = (pMyStack*)malloc(sizeof(pMyStack));
 20     if (temp == NULL) {
 21         printf("Failed to request memory");
 22         exit(1);
 23     }
 24 
 25     temp->top = NULL;
 26     return temp;
 27 }
 28 
 29 /**
 30 * @brief 判断栈是否为空
 31 * @param 指向栈的指针
 32 * @return 1 栈为空,0 栈不为空
 33 */
 34 int IsEmpty(pMyStack *obj)
 35 {
 36     return obj->top == NULL;
 37 }
 38 
 39 
 40 /**
 41 * @brief 入栈
 42 * @param obj 指向栈的指针
 43 * @param value 气温
 44 * @param index 下标
 45 */
 46 void Push(pMyStack *obj, int value, int index)
 47 {
 48     pNode *temp = (pNode*)malloc(sizeof(pNode));
 49     if (temp == NULL) {
 50         printf("Failed to request memory");
 51         exit(1);
 52     }
 53 
 54     temp->value = value;
 55     temp->index = index;
 56     temp->next = obj->top;
 57     obj->top = temp;
 58 }
 59 
 60 /**
 61 * @brief 出栈
 62 * @param obj 指向栈的指针
 63 */
 64 void Pop(pMyStack *obj)
 65 {
 66     if (obj->top != NULL) {
 67         pNode *temp = obj->top;
 68         obj->top = obj->top->next;
 69         free(temp);
 70     }
 71 }
 72 
 73 /**
 74 * @brief 获取栈顶的气温
 75 * @param obj 指向栈的指针
 76 * @return 栈顶的气温
 77 */
 78 int GetTopValue(pMyStack *obj)
 79 {
 80     if (obj->top != NULL) {
 81         return obj->top->value;
 82     } else {
 83         exit(1);
 84     }
 85 }
 86 
 87 /**
 88 * @brief 获取栈顶的下标
 89 * @param obj 指向栈的指针
 90 * @return 栈顶的下标
 91 */
 92 int GetTopIndex(pMyStack *obj)
 93 {
 94     if (obj->top != NULL) {
 95         return obj->top->index;
 96     } else {
 97         return -1;
 98     }
 99 }
100 
101 /**
102  * Note: The returned array must be malloced, assume caller calls free().
103  */
104 int* dailyTemperatures(int* T, int TSize, int* returnSize)
105 {
106     *returnSize = TSize;
107     int *result = (int*)malloc(sizeof(int) * TSize);
108     pMyStack *myStack = CreateStack();
109 
110     for (int i = TSize - 1; i >= 0; i--) {
111         if (i == TSize - 1) {
112             result[i] = 0;
113             Push(myStack, T[i], i);
114             continue;
115         }
116 
117         //找出后边第一个比今天气温高的日子
118         while (!IsEmpty(myStack)) {
119             if (GetTopValue(myStack) <= T[i]) {
120                 Pop(myStack);
121             } else {
122                 result[i] = GetTopIndex(myStack) - i;
123                 break;
124             }
125         }
126 
127         //栈为空说明后边没有比今天气温高的日子
128         if (IsEmpty(myStack)) {
129             result[i] = 0;
130         }
131 
132         Push(myStack, T[i], i);
133     }
134 
135     return result;
136 }

 

以上是关于链表实现栈的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法—数组栈和链表栈

数据结构与算法—数组栈和链表栈

C++中利用链表实现一个栈

深搜+栈==实现扁平化多级双向链表

栈的实现原理

算法漫游指北(第五篇):栈队列栈结构实现基于列表实现栈基于链表实现栈基于列表实现队列基于链表实现队列