栈
1 //顺序栈 2 //1、 顺序栈的类型定义 3 #define StackSize 100 //假定预分配的栈空间最多为100个元素 4 typedef char DataType;//假定栈元素的数据类型为字符 5 typedef struct{ 6 DataType data[StackSize]; 7 int top; 8 }SeqStack; 9 //顺序栈的基本运算 10 //(1) 置栈空 11 void InitStack(SeqStack *S) 12 {//将顺序栈置空 13 S->top=-1; 14 } 15 16 //(2) 判栈空 17 int StackEmpty(SeqStack *S) 18 { 19 return S->top==-1; 20 } 21 22 //(3) 判栈满 23 int StackFull(SeqStack *SS) 24 { 25 return S->top==StackSize-1; 26 } 27 28 //(4) 进栈 29 void Push(S,x) 30 { 31 if (StackFull(S)) 32 Error("Stack overflow"); //上溢,退出运行 33 S->data[++S->top]=x;//栈顶指针加1后将x入栈 34 } 35 36 //(5) 退栈 37 DataType Pop(S) 38 { 39 if(StackEmpty(S)) 40 Error("Stack underflow"); //下溢,退出运行 41 return S->data[S->top--];//栈顶元素返回后将栈顶指针减1 42 } 43 44 //(6) 取栈顶元素 45 DataType StackTop(S) 46 { 47 if(StackEmpty(S)) 48 Error("Stack is empty"); 49 return S->data[S->top]; 50 } 51 //链栈 52 //链栈的类型说明如下: 53 54 typedef struct stacknode{ 55 DataType data 56 struct stacknode *next 57 }StackNode; 58 59 typedef struct{ 60 StackNode *top; //栈顶指针 61 }LinkStack; 62 63 //(1) 置栈空 64 Void InitStack(LinkStack *S) 65 { 66 S->top=NULL; 67 } 68 //(2) 判栈空 69 int StackEmpty(LinkStack *S) 70 { 71 return S->top==NULL; 72 } 73 74 //(3) 进栈 75 void Push(LinkStack *S,DataType x) 76 {//将元素x插入链栈头部 77 StackNode *p=(StackNode *)malloc(sizeof(StackNode)); 78 p->data=x; 79 p->next=S->top;//将新结点*p插入链栈头部 80 S->top=p; 81 } 82 //(4) 退栈 83 DataType Pop(LinkStack *S) 84 { 85 DataType x; 86 StackNode *p=S->top;//保存栈顶指针 87 if(StackEmpty(S)) 88 Error("Stack underflow."); //下溢 89 x=p->data; //保存栈顶结点数据 90 S->top=p->next; //将栈顶结点从链上摘下 91 free(p); 92 return x; 93 } 94 //(5) 取栈顶元素 95 DataType StackTop(LinkStack *S) 96 { 97 if(StackEmpty(S)) 98 Error("Stack is empty.") 99 return S->top->data; 100 } 101 //栈的应用实例 102 //1、数制转换 103 // 将一个非负的十进制整数N转换为另一个等价的基为B的B进制数的问题,很容//易通过"除B取余法"来解决。 104 // 【例】将十进制数13转化为二进制数。 105 /* 解答:按除2取余法,得到的余数依次是1、0、1、1,则十进制数转化为二进制数为1101。 106 分析:由于最先得到的余数是转化结果的最低位,最后得到的余数是转化结果的最高位,因此很容易用栈来解决。 107 108 转换算法如下:*/ 109 110 typedef int DataType;//应将顺序栈的DataType定义改为整型 111 void MultiBaseOutput (int N,int B) 112 {//假设N是非负的十进制整数,输出等值的B进制数 113 int i; 114 SeqStack S; 115 InitStack(&S); 116 while(N){ //从右向左产生B进制的各位数字,并将其进栈 117 push(&S,N%B); //将bi进栈0<=i<=j 118 N=N/B; 119 } 120 while(!StackEmpty(&S)){ //栈非空时退栈输出 121 i=Pop(&S); 122 printf("%d",i); 123 } 124 }