21-堆栈

Posted tiantiancode

tags:

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

Stack()

 

栈的结构:

 技术图片

 

下面是数据结构的集中类型:

 1 struct stu   //链表
 2 
 3     int data;  //抽象出的一种数据
 4     struct stu *pnext;   //链表的指针
 5 ;
 6 
 7 struct    //顺序表
 8 
 9     int data[100];
10     int size;    //顺序表大小标志
11 ;
12 
13 struct  //顺序结构的栈
14 
15     int data[100];
16     int top; //栈顶标志
17 ;

 

顺序结构的栈:

 技术图片

 

 1 #include <stdio.h>
 2 #define MAXSIZE 100
 3 
 4 typedef struct  //顺序结构的栈
 5 
 6     int data[MAXSIZE];
 7     int top; //栈顶标志
 8 
 9 SeqStack;
10 
11  
12 void StackInit(SeqStack *S);  //初始化
13 int StackPush(SeqStack *S, int data);//入栈
14 int StackPop(SeqStack *S,int *data);//出栈
15 
16 int main()
17 
18     int data;
19     SeqStack myStack; //定义一个变量
20     StackInit(&myStack); //初始化栈
21 
22     for (int i = 0; i < 10; i++)
23     
24         StackPush(&myStack, i+1);
25         printf("%d\\t", myStack.data[i]);
26     
27 
28     for (int i = 0; i < 10; i++)
29     
30         StackPop(&myStack, &data);
31         printf("%d\\t", data);
32     
33 
34     return 0;
35 
36 
37 
38 //初始化
39 void StackInit(SeqStack *S)
40 
41     S->top = 0;
42 
43 
44 //入栈
45 int StackPush(SeqStack *S, int data)
46 
47     if (S->top >= MAXSIZE)  //判断栈是否满
48     
49         printf("栈满!\\n");
50         return 0;
51     
52     else
53     
54         S->data[S->top] = data;  //往栈顶加入数据
55         S->top++;
56         return 1;
57     
58 
59 
60 
61 //出栈  不是要删除  而是得到
62 int StackPop(SeqStack *S,int *data)
63 
64     if (S->top <= 0)
65     
66         printf("栈空\\n");
67         return 0;
68     
69     else
70     
71         S->top--;
72         *data = S->data[S->top];
73         return 1;
74     
75 
76 
77  
78 //栈顶的元素  出栈判空  入栈判满  *data = S->data[S->top-1];
79 // 1 2 3 4 5 6 7 8 9 10

 

 

链式结构的栈:

 技术图片

 

 1 //链式栈
 2 #include <stdio.h>
 3 
 4 typedef struct node
 5 
 6 int data;   
 7 struct node *pnext;
 8 LsNode;
 9 
10  
11 void StackInit(LsNode **head);//初始化
12 void StackPush(LsNode *head, int data);  //入栈
13 int StackPop(LsNode *head, int *data); //出栈
14 
15 int main()
16 
17     int data;
18     LsNode *head;  //在主函数中定义变量的时候,系统根据变量的数据类型开辟大小。int a 4  double b 8
19     //定义指针变量的时候必须用malloc去只指定内存的大小。
20     StackInit(&head);
21 
22     for (int i = 0; i < 10; i++)
23     
24         StackPush(head, i + 1);
25     
26 
27 
28     for (int i = 0; i < 10; i++)
29     
30         StackPop(head, &data);
31         printf("%d\\t", data);
32     
33 
34     return 0;
35 
36 
37  
38 //初始化
39 void StackInit(LsNode **head)
40 
41     *head = (LsNode *)malloc(sizeof(LsNode));
42     (*head)->pnext = NULL;  //int =NULL;
43 
44 
45 //入栈
46 void StackPush(LsNode *head,int data)
47 
48     LsNode *p;  //从新定义一个节点
49     p = (LsNode *)malloc(sizeof(LsNode));  //为新的节点开辟空间
50 
51     //malloc 开辟一块内存 并且返回一个空指针类型,空指针类型可以强制转换为任意其他指针类型。
52     p->data = data; //对新节点的内容填充
53     p->pnext = head->pnext; //新节点的pnext指向NULL
54     head->pnext = p; //新节点的地址赋给head->pnext.
55 
56 
57  
58 //出栈
59 int StackPop(LsNode *head,int *data)
60 
61     LsNode *p = head->pnext;  //p指向哪里? 指向第一个元素
62     if (NULL == p)
63     
64         printf("栈空\\n");
65         return 0;
66     
67     else
68     
69         head->pnext = p->pnext;     //让head->pnext指向下一个元素
70         *data = p->data; //得到需要的第一个元素保存在data变量中
71         free(p); //释放p指向的内存。
72         return 1;
73     
74 

 

//队列吗 讲不完

 技术图片

技术图片

注意:循环队列 队列满  头尾重合  队列的大小 size 或者num  或者count计数

 

Typdef struct

  Int data[100];

  Int front;

  Int end;

  Int count;

 

链式:很灵活  

作业:熟悉队列的结构并且尝试去操作队列。

 

以上是关于21-堆栈的主要内容,如果未能解决你的问题,请参考以下文章

堆栈与堆栈和堆与堆

将堆栈传递给函数

如何查看友好的 .NET 调用堆栈?

Xcode 堆栈视图导致崩溃?

为啥调试器需要符号来重建堆栈?

不安全的 Rust 中的堆栈引用,但确保不安全不会从堆栈中泄漏?