数据结构(栈和队列)

Posted tianliang-2000

tags:

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

  定义:栈是一个先进后出的线性表,要求只在表尾进行删除和插入操作

  注:对于栈来说,表尾成为栈的栈顶(top),相应的表头称为栈低(bottom)。

  因为栈的本质是线性表,所以栈也分为顺序存储结构和链式存储结构;(一般用顺序存储实现)

栈的顺序存储:

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 #include <stdlib.h>
 4 #define initSize 10
 5 #define sup 2
 6 typedef int ElemType;
 7 
 8 typedef struct{
 9     int stackSize;//栈当前可用最大容量
10     ElemType *base;//栈低
11     ElemType *top;//栈顶
12 }sqStack;
13 
14 void initStack(sqStack *);
15 void Push(sqStack *,ElemType);
16 void pop(sqStack *,ElemType *);
17 
18 void pop(sqStack *s,ElemType *val){
19     if(s->base==s->top){
20         return ;
21     }
22     *val=*(--s->top);
23 }
24 
25 void Push(sqStack *s,ElemType val){
26     if(s->top-s->base>=s->stackSize){//判断栈是否存满,并追加空间
27         s->base=(ElemType *)realloc(s->base,(s->stackSize+sup) * sizeof(ElemType));
28         if(!s->base)
29             exit(0);
30         s->top=s->base+s->stackSize;
31         s->stackSize+=sup;
32     }
33     *(s->top)=val;//栈顶压栈数据
34     s->top++;
35 }
36 
37 void initStack(sqStack *s){
38     s->base=(ElemType *)malloc(initSize * sizeof(ElemType));
39     if(!s->base)
40         exit(0);
41     s->top=s->base;
42     s->stackSize=initSize;
43 }
44 
45 void main(){
46     int val;
47     sqStack s;
48     initStack(&s);
49     printf("请输入压栈(-1退出):");
50     scanf("%d",&val);
51     while(val != -1){
52         Push(&s,val);
53         printf("请输入压栈(-1退出):");
54         scanf("%d",&val);
55     }
56     printf("开始弹栈:
");
57     while(s.top!=s.base){
58         pop(&s,&val);
59         printf("%d  ",val);
60     }
61 }

后缀表达式

  利用栈的方式:遍历中缀表达式;为数字压栈,为符号时弹栈;

  方法:从左到右遍历中缀表达式,若为数字时直接输出;若为符号,则判断其与栈顶符号的优先级:是‘)’的话则栈中符号依次出栈,直到遇到‘(’【括号不会输出在后缀表达式中】;其他符号:如果该符号优先级小于等于栈顶优先级,则栈中符号依次弹栈输出,直到栈顶符号优先级小于带压栈符号优先级或者栈顶为‘(’;如果遍历结束,再将栈中符号依次出栈输出;

例如:5+2*(3*(3-1*2+1))  =>  523312*-1+**+

  后缀表达式的计算:1、按次序读取后缀表达式的每个字符。2、读取到操作数时,把操作数压入栈中。3、读取到操作符时,对栈顶的2个操作数做相应运算,要注意操作数的前后顺序。结果压入栈中。4、读取完所有字符后,弹出栈。得到的值就是所求结果。


 

队列

  定义:只允许在一端进行插入操作,另一端进行删除操作的线性表

    与栈相反,队列是一种先进后出的线性表。

    队列既可以用链表实现,也可以用顺序存储实现,(一般用链表实现)

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 #include <stdlib.h>
 4 typedef int ElemType;
 5 
 6 typedef struct QNode{
 7     ElemType data;
 8     struct QNode *next;
 9 }QNode,* QueuePrt;
10 
11 typedef struct{
12     QueuePrt head;//队头
13     QueuePrt rear;//队尾
14 }LinkQueue;
15 
16 void init(LinkQueue *);
17 void Insedt(LinkQueue *,ElemType);
18 void pop(LinkQueue *,ElemType *);
19 
20 void init(LinkQueue *q){
21     q->head=q->rear=(QueuePrt)malloc(sizeof(QNode));
22     if(!q->head)
23         exit(0);
24     q->head->next=NULL;
25 }
26 
27 void Insedt(LinkQueue *q,ElemType e){
28     QueuePrt p=(QueuePrt)malloc(sizeof(QNode));
29     if(p==NULL)
30         exit(0);
31     p->data=e;
32     p->next=NULL;
33     q->rear->next=p;//用队尾链接
34     q->rear=p;//更新队尾
35 }
36 
37 void pop(LinkQueue *q,ElemType *e){
38     QueuePrt p=q->head->next;//得到队列中头结点指向的结点()队列中第一个值
39     q->head->next=p->next;//更新头结点指向的结点(在队列中删除原先第一个有值结点)
40     if(q->rear==p){//判断删除结点是否为队列中最后一个结点
41         q->rear=q->head;//队列将要成为空队列,将指向尾结点的指针指向头结点
42     }
43     *e=p->data;
44     free(p);
45 }
46 
47 void main(){
48     ElemType val;
49     LinkQueue s;
50     init(&s);
51     printf("%d
",s.head->data);
52     printf("请输入进入队列的数(-1退出):");
53     scanf("%d",&val);
54     while(val != -1){
55         Insedt(&s,val);
56         printf("请输入进入队列的数(-1退出):");
57         scanf("%d",&val);
58     }
59     printf("开始出队列:
");
60     while(s.head!=s.rear){
61         pop(&s,&val);
62         printf("%d  ",val);
63     }
64     printf("
");
65 }

 

以上是关于数据结构(栈和队列)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之栈和队列

栈和队列知识点总结

栈和队列数据结构的特点,啥情况下用到栈,啥情况下用到队列(各举3个例子)

数据结构栈和队列

博客作业03--栈和队列

栈和队列