顺序栈——课上练
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 }