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             }

 

posted @ 2013-09-28 15:50  疯狂的癫子  阅读(449)  评论(0编辑  收藏  举报