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