顺序栈和链栈的实现

顺序栈和链栈的实现

这学期开了数据结构,刚开始以为代码应该会很简单,但是真正实现起来才发现有好多细节需要注意, 而且发现指针的姿势忘了好多好多((٩(//̀Д/́/)۶))

 

130h.h

 1 #include <bits/stdc++.h>
 2 #define MAX 100
 3 struct node1
 4 {
 5     int *base;
 6     int *top;
 7     int Size;
 8 };
 9 struct node2
10 {
11     int data;
12     node2 *next;
13 };
14 
15 void menu();
16 bool init1(node1 *&s);
17 void input1(node1 *s, int x);
18 bool pop1(node1 *s);
19 int top1(node1 *s);
20 bool init2(node2 *&s);
21 void input2(node2 *s, int x);
22 bool pop2(node2 *s);
23 int top2(node2 *s);

 

main.cpp

 1 #include "130h.h"
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int n, x, t, i;
 7     node1 *s1;
 8     node2 *s2;
 9     while(1)
10     {
11         menu();
12         cin>>t;
13         if(t==-1)
14         {
15             free(s1);
16             free(s2);
17             break;
18         }
19         switch(t)
20         {
21         case 1:
22             if(init1(s1)) puts("yes");
23             else puts("no");
24             break;
25         case 2:
26             puts("输入元素,-1结束");
27             while(1)
28             {
29                 scanf("%d", &x);
30                 if(x == -1) break;
31                 input1(s1, x);
32             }
33             puts("插入成功");
34             break;
35         case 3:
36             puts("请输入n的值");
37             cin>>n;
38             for(i = 1; i <= n; i++)
39             {
40                 if(!pop1(s1))
41                 {
42                     puts("栈空!");
43                     break;
44                 }
45             }
46             if(i == n+1) puts("删除成功");
47             break;
48         case 4:
49             x = top1(s1);
50             if(x == -1) puts("栈空!");
51             else printf("%d\n", x);
52             break;
53         case 5:
54             if(init2(s2)) puts("yes");
55             else puts("no");
56             break;
57         case 6:
58             puts("输入元素,-1结束");
59             while(1)
60             {
61                 scanf("%d", &x);
62                 if(x == -1) break;
63                 input2(s2, x);
64             }
65             puts("插入成功");
66             break;
67         case 7:
68             puts("请输入n的值");
69             cin>>n;
70             for(i = 1; i <= n; i++)
71             {
72                 if(!pop2(s2))
73                 {
74                     puts("栈空");
75                     break;
76                 }
77             }
78             if(i==n+1) puts("删除成功");
79             break;
80         case 8:
81             x = top2(s2);
82             if(x == -1) puts("栈空!");
83             else printf("%d\n", x);
84             break;
85         }
86     }
87     return 0;
88 }

 

function.cpp

 1 #include "130h.h"
 2 
 3 void menu()
 4 {
 5     puts("");
 6     puts("-------顺序栈操作-------");
 7     puts("1 初始化顺序栈");
 8     puts("2 插入栈顶元素, -1结束");
 9     puts("3 删除n个栈顶元素");
10     puts("4 弹出栈顶元素");
11     puts("-------链栈操作--------");
12     puts("5 初始化链栈");
13     puts("6 插入栈顶元素, -1结束");
14     puts("7 删除n个栈顶元素");
15     puts("8 弹出栈顶元素");
16     puts("------------------------");
17     puts("-1 终止程序");
18     puts("");
19 }
20 
21 bool init1(node1 *&s)//初始化顺序栈
22 {
23     s = (node1*)malloc(sizeof(node1));
24     s->base = (int*)malloc(MAX*sizeof(int));
25     if(!s->base) return 0;
26     s->top = s->base;
27     s->Size = MAX;
28     return 1;
29 }
30 
31 void input1(node1 *s, int x)//插入栈顶元素
32 {
33     if(s->top - s->base == MAX)
34     {
35         s->base = (int*)realloc(s->base, sizeof(int));
36         s->top = s->base + MAX;
37     }
38     *s->top++ = x;
39 }
40 
41 bool pop1(node1 *s)//删除栈顶元素
42 {
43     if(s->top == s->base) return 0;
44     s->top--;
45     return 1;
46 }
47 
48 int top1(node1 *s)//弹出栈顶元素
49 {
50     if(s->top == s->base) return -1;
51     return *(s->top-1);
52 }
53 
54 bool init2(node2 *&s)//初始化链栈
55 {
56     s = (node2*)malloc(sizeof(node2));
57     if(!s) return 0;
58     s->next = NULL;
59     return 1;
60 }
61 
62 void input2(node2 *s, int x)插入栈顶元素
63 {
64     node2 *p;
65     p = (node2*)malloc(sizeof(node2));
66     p->data = x;
67     p->next = s->next;
68     s->next = p;
69 }
70 
71 bool pop2(node2 *s)删除栈顶元素
72 {
73     if(s->next == NULL) return 0;
74     node2 *p = s->next;
75     s->next = p->next;
76     free(p);
77     return 1;
78 }
79 
80 int top2(node2 *s)弹出栈顶元素
81 {
82     if(!s->next) return -1;
83     return s->next->data;
84 }

加油~

posted @ 2018-04-04 13:50 LesRoad 阅读(...) 评论(...) 编辑 收藏

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值