1 #include <stdio.h>
2
3 /*此处是顺序栈数据结构定义*/
4 typedef int DataType;
5 struct seqStack
6 {//有3个数据成员
7 int MAXNUM;//用于记录顺序栈中能存放的最大元素个数的 整型 MAXNUM
8 int top;//用于存放顺序栈的栈顶位置,初始化为0或-1 均可 整型 curNum
9 DataType *element;//用于存放顺序栈数据元素的连续空间的起始地址
10 };
11
12 typedef struct seqStack *PseqStack;
13 //第一关
14 PseqStack createNullStack_seq(int m)
15 {//此处填写代码,创建一个空的顺序栈,能存放的最大元素个数为 m,栈顶top设置为0
16 //若m=0,则返回NULL
17 if(m==0){
18 return 0;
19 }
20 PseqStack stack = (PseqStack)malloc(sizeof(struct seqStack));
21 if(stack!=NULL){
22 stack->element = (DataType*)malloc(sizeof(DataType)*m);
23 stack->MAXNUM=m;
24 stack->top=0;
25 }
26 return stack;
27 }
28
29 //第二关
30 int isNullStack_seq(PseqStack L)
31 {
32 //判断顺序栈是否为空,若为空,返回值为1,否则返回值为0,若栈不存在,则返回-1
33 if(L==NULL){
34 return -1;
35
36 }
37 if(L->top==0){
38 return 1;
39 }
40 return 0;
41 }
42
43
44 //第三关
45 int isFullStack_seq(PseqStack L)
46 {
47 //判断顺序栈是否已满,若已满,返回值为1,否则返回值为0
48 if(L->top==L->MAXNUM){
49 return 1;
50 }
51 return 0;
52 }
53
54
55 //第四关
56 int push_seq(PseqStack L ,DataType x)
57 {//在顺序栈中插入数据元素x,若插入不成功,返回0;插入成功返回值为1
58 if(L==NULL||isFullStack_seq(L)){
59 return 0;
60 }
61 L->top++;
62 L->element[L->top]=x;
63 return 1;
64
65 }
66
67
68
69 //第五关
70 DataType pop_seq(PseqStack L)
71 {//弹栈并返回删除元素,若栈为空,则返回-1
72 if(L==NULL){
73 return;
74 }
75 if(L->top==0){
76 return -1;
77 }else{
78 int ans=L->element[L->top];
79 L->element[L->top]=0;
80 L->top--;
81 return ans;
82 }
83
84 }
85
86 //第六关
87 DataType top_seq(PseqStack L)
88 {// 取栈顶元素返回,若栈为空,则返回-1
89 if(L->top==0&&L!=NULL){
90 return -1;
91 }
92 if(L!=NULL){
93 return L->element[L->top];
94 }
95 }
96
97 //销毁顺序栈,释放栈所占存储空间
98 int destroystack_seq(PseqStack L)
99 {
100 //返回值为销毁的栈中现有数据元素的个数,若待销毁的线性表不存在,则返回0
101 if(L==NULL){
102 return 0;
103 }
104 int cnt=0;
105 while(L->top!=0){
106 cnt++;
107 L->top--;
108 }
109 }
110
111
112 //第七关
113 //使用已实现的栈操作,实现数制转换
114
115 void print(PseqStack L)
116 {
117 //逐个弹出栈L中的数据元素并输出,输出数据间不需要任何间隔符号
118 if(L==NULL){
119 return;
120 }
121 while(L->top!=0){
122 printf("%d",L->element[L->top]);
123 L->top--;
124 }
125
126 }
127
128 void convert(int data , int k)
129 {
130 //利用栈实现将data转换为k进制,k可能是2,8,16. 在本函数内实现转换并调用print函数输出转换后的结果
131 //十六进制时输出 A ,B ,C, D,E,F 使用大写字母
132 PseqStack L= createNullStack_seq(1000);
133 if(k==2){
134 while(data){
135 push_seq(L,data%2);
136 data/=2;
137 }
138 while(L->top!=0){
139 printf("%d",pop_seq(L));
140 }
141
142 }
143 if(k==8){
144 while(data){
145 push_seq(L,data%8);
146 data/=8;
147 }
148 while(L->top!=0){
149 printf("%d",pop_seq(L));
150 }
151
152 }
153 if(k==16){
154 char Hex[20]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
155 while(data){
156 push_seq(L,data%16);
157 data/=16;
158 }
159 while(L->top!=0){
160 printf("%c", Hex[pop_seq(L)]);
161
162 }
163
164 }
165 }