顺序栈——课上练

  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 }
View Code

 

posted @ 2020-10-14 20:58  ethon-wang  阅读(617)  评论(0编辑  收藏  举报