数据结构栈和队列的实现

数据结构的实验,栈和队列的实现。

栈的特点:先进后出,类似于一个只有一个口子,且一次只能容一个物体通过的容器,放在上面的物体必须先拿出才能拿下面的。

队列的特点:先进先出,类似于火车通过隧道,先进入隧道的先出隧道,切只能从隧道一边进入,一边出去。

我下面用的是链式结构来实现。

 

首先是栈的代码:

 1 #include<iostream>
 2 using namespace std;
 3 //************链式栈的应用************
 4 //结构定义 
 5 typedef struct StackNode{
 6     int data;
 7     struct StackNode *next;
 8 }StackNode,*LinkStack;
 9 
10 //初始化 
11 void InitStack(LinkStack &S)
12 {
13     S = NULL;
14 }
15 
16 //入栈
17 void Push(LinkStack &S,int e)
18 {
19     StackNode *p = new StackNode;//创建一个新节点 
20     p->data = e;//新节点的值为 e 
21     p->next = S;//S为上一次的第一个节点,让新加入的节点指向它; 
22     S = p;//将新加入的节点为S(第一个节点) 
23 }
24 
25 //删除栈顶元素
26 void Pop(LinkStack &S)
27 {
28     if(S == NULL)
29     {
30         cout<<"栈已空"<<endl;
31         return; 
32     }
33     StackNode *p = new StackNode;
34     p = S;
35     S = S->next;
36     delete p;
37 }
38 
39 //判断栈是否为空
40 int StackEmpty(LinkStack S)
41 {
42     if(S == NULL)
43         return 1;
44     else
45         return 0;
46 }
47 
48 //取栈顶元素
49 int GetTop(LinkStack S)
50 {
51     if(S != NULL)
52         return S->data;
53 }
54 
55 int main()
56 {
57     LinkStack S;
58     int n,a;
59     while(cin>>n)
60     {
61         InitStack(S);
62         for(int i=0; i<n; ++i)
63         {
64             cin>>a;
65             Push(S,a);//入栈
66         }
67         
68         while(!StackEmpty(S))
69         {
70             cout<<GetTop(S)<<' ';//出栈 
71             Pop(S);//删除栈顶元素 
72         }
73         cout<<endl;
74     }
75     delete S;
76     return 0;
77 }

 

 

接着是队列的代码:

 1 #include<iostream>
 2 using namespace std;
 3 //**************链式队列应用**************
 4 
 5 //结构定义
 6 typedef struct QNode{
 7     int data;
 8     struct QNode *next;
 9 }QNode,*QueuePtr;
10 typedef struct{
11     QueuePtr front,rear;
12 }LinkQueue;
13 
14 //初始化 
15 void InitQueue(LinkQueue &Q)
16 {
17     Q.front = Q.rear = new QNode;
18     Q.front->next = NULL;
19 }
20 
21 
22 //入队
23 void EnQueue(LinkQueue &Q,int e)
24 {
25     QNode *q = new QNode;
26     q->data = e;
27     q->next = NULL;
28     Q.rear->next = q;
29     Q.rear = q;
30 }
31 
32 //判断队列是否为空
33 int QueueEmpty(LinkQueue Q)
34 {
35     if(Q.rear == Q.front)
36         return 1;
37     else 
38         return 0;
39  } 
40 
41 //删除队头元素 
42 void DeQueue(LinkQueue &Q)
43 {
44     if(Q.rear == Q.front)
45     {
46         cout<<"队列已空"<<endl;
47         return;
48     }
49     QNode *q = new QNode;
50     q = Q.front->next;
51     Q.front->next = q->next;
52     if(Q.rear == q)
53         Q.rear = Q.front;
54     delete q;
55 }
56 
57 //出队
58 int GetQueue(LinkQueue Q)
59 {
60     if(Q.front != Q.rear)
61         return Q.front->next->data;
62 }
63 
64 void Cancel(LinkQueue &Q)
65 {
66     delete Q.rear;
67     delete Q.front;
68 }
69 
70 int main()
71 {
72     LinkQueue Q;
73     int n,a;
74     while(cin>>n)
75     {
76         InitQueue(Q);
77         for(int i=0; i<n; ++i)
78         {
79             cin>>a; 
80             EnQueue(Q,a);//入队 
81         }
82         
83         while(!QueueEmpty(Q))
84         {
85             cout<<GetQueue(Q)<<' ';//出队 
86             DeQueue(Q);//删除队顶元素 
87         }
88         cout<<endl;
89     }
90     Cancel(Q);
91     return 0;
92 }

 

因为是数据结构是实验,所以写的比较简单,以后有时间再写个详细的。

 

转载于:https://www.cnblogs.com/tuyang1129/p/9140681.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值