• 栈与队列:栈的链式储存结构


      1 链栈通常用单链表表示,由于栈的主要操作是栈顶插入与删除,显然以链表的头部作为栈顶最方便,而且没必要为了操作方便附加一个头结点
      2 //链式存储结构(将单链表头指针与栈顶合二为一) 
      3 typedef struct StackNode
      4 {
      5     ElemType data;
      6     struct StackNode *next;
      7 }StackNode,*LinkStackPtr;
      8 typedef struct LinkStack
      9 {
     10     LinkStackPtr top;
     11     int count;
     12 }
     13 Status Push(LinkStack *s,ElemType e)
     14 {
     15     LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode));
     16     p->data = e;
     17     p->next = s->top;  //新插入结点的指针域指向栈顶
     18     s->top = p;        //栈顶换成p
     19     s->count++;
     20     return OK;
     21 }
     22 
     23 Status Pop(LinkStack *s,ElemType *e)
     24 {
     25     LinkStackPtr p;
     26     if(StackEmpty(*s))
     27     {
     28         return ERROR;
     29     }
     30     *e = s->top->data;
     31     p = s->top;
     32     s->top = s->top->next;
     33     free(p);
     34     s->count--;
     35     return OK; 
     36 } 
     37 
     38 
     39 可执行代码来自https://blog.csdn.net/sinat_35297665/article/details/79489822
     40 #include <iostream>
     41 
     42 using namespace std;
     43 
     44 typedef struct node{
     45 
     46     int data;
     47 
     48     struct node *next;
     49 
     50 }Node;
     51 
     52  
     53 
     54 typedef struct stack{
     55 
     56     Node *top;            /**书本写法是:加一个bottom,个人感觉没什么用,反而加一个count用于表示节点数会更好*/
     57 
     58     int count;
     59 
     60 }Link_Stack;
     61 
     62  
     63 
     64 /**创建一个空栈*/
     65 
     66 Link_Stack * Creat_stack()
     67 
     68 {
     69 
     70     Link_Stack *p;
     71 
     72     p = new Link_Stack;   /**这一步不要忘!需要给p创建空间*/
     73 
     74     p->count = 0;
     75 
     76     p->top = NULL;
     77 
     78  
     79 
     80     return p;
     81 
     82 }
     83 
     84  
     85 
     86 /**入栈操作:push*/
     87 
     88 Link_Stack * Push_stack(Link_Stack *p,int elem)
     89 
     90 {
     91 
     92     if(NULL == p)
     93 
     94         return NULL;
     95 
     96  
     97 
     98     Node *temp;
     99 
    100     temp = new Node;
    101 
    102     temp->data = elem;
    103 
    104  
    105 
    106     temp->next = p->top;   /**注意这里和队列的入队操作不同,next指向不同,为了方便出栈操作*/
    107 
    108     p->top = temp;
    109 
    110  
    111 
    112     p->count += 1;
    113 
    114  
    115 
    116     return p;
    117 
    118 }
    119 
    120  
    121 
    122 /**出栈操作:pop*/
    123 
    124 Link_Stack * Pop_stack(Link_Stack *p)
    125 
    126 {
    127 
    128     Node *temp;
    129 
    130     temp = p->top;
    131 
    132     if(NULL == p->top)
    133 
    134     {
    135 
    136         cout << "The stack is empty." << endl;
    137 
    138         return p;
    139 
    140     }
    141 
    142     else{
    143 
    144         p->top = p->top->next;    /** temp = temp->next;  千万不能这么写,看看下一步是什么?*/
    145 
    146         delete temp;
    147 
    148  
    149 
    150         p->count -= 1;
    151 
    152  
    153 
    154         return p;
    155 
    156     }
    157 
    158 }
    159 
    160  
    161 
    162 /**栈的遍历:输出栈*/
    163 
    164 int Show_stack(Link_Stack *p)
    165 
    166 {
    167 
    168     Node *temp;
    169 
    170     temp = p->top;
    171 
    172  
    173 
    174     if(NULL == p->top)
    175 
    176     {
    177 
    178         cout << "The stack is empty." << endl;
    179 
    180         return 0;
    181 
    182     }
    183 
    184     while(NULL != temp)
    185 
    186     {
    187 
    188         cout << temp->data << ' ';
    189 
    190         temp = temp->next;
    191 
    192     }
    193 
    194     cout << endl;
    195 
    196  
    197 
    198     return 0;
    199 
    200 }
    201 
    202  
    203 
    204 int main()
    205 
    206 {
    207 
    208     int i = 5;
    209 
    210     int elem;
    211 
    212     Link_Stack *p;
    213 
    214     p = Creat_stack();
    215 
    216     while(i--)
    217 
    218     {
    219 
    220         cin >> elem;
    221 
    222         Push_stack(p,elem);
    223 
    224     }
    225 
    226     cout << "空栈插入5个元素后:" << endl;
    227 
    228     Show_stack(p);
    229 
    230  
    231 
    232     cout << "删除3个元素后:" << endl;
    233 
    234     for(i = 3;i--;)
    235 
    236     {
    237 
    238         Pop_stack(p);
    239 
    240     }
    241 
    242     Show_stack(p);
    243 
    244     cout << "count:" << p->count << endl;
    245 
    246  
    247 
    248     cout << "删除2个元素后:" << endl;
    249 
    250     for(i = 2;i--;)
    251 
    252     {
    253 
    254         Pop_stack(p);
    255 
    256     }
    257 
    258     Show_stack(p);
    259 
    260     cout << "count:" << p->count << endl;
    261 
    262  
    263 
    264     Push_stack(p,6);
    265 
    266     cout << "插入元素6后:" << endl;
    267 
    268     Show_stack(p);
    269 
    270     cout << "count:" << p->count << endl;
    271 
    272  
    273 
    274     return 0;
    275 
    276 }
  • 相关阅读:
    算法题:单调递增的数字
    算法题:搜索旋转排序数组
    算法题:K个一组翻转链表
    django错误
    virtualenvwrapper出错
    谷歌浏览器css样式不显示问题
    Python爬取豆瓣电子书信息
    flask secret key的作用
    【Hibernate】--实体状体与主键生成策略
    【Struts2+Spring3+Hibernate3】SSH框架整合实现CRUD_1.3
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12491305.html
Copyright © 2020-2023  润新知