顺序栈的实现[原创]

 

  1ExpandedBlockStart.gifContractedBlock.gif/**//*========================顺序栈的实现===================================*/
  2#include <stdio.h>
  3#include <malloc.h>
  4
  5#define STACK_INIT_SIZE 100
  6#define STACKINCREMENT 10
  7        
  8ExpandedBlockStart.gifContractedBlock.giftypedef struct{  /**//*顺序栈的类型定义*/
  9    char *base;
 10    char *top;
 11    int stacksize;
 12}
sqstack;
 13
 14
 15
 16ExpandedBlockStart.gifContractedBlock.gifint visit(char p){
 17ExpandedSubBlockStart.gifContractedSubBlock.gif    if(p>=65&&p<=97)/**//*-----visit函数用与栈的遍历调用,判断一个字母是否是大写字母-----------*/
 18        return 1;
 19    else
 20        return 0;
 21}

 22
 23
 24ExpandedBlockStart.gifContractedBlock.gifvoid print(sqstack s)/**//*----依次输出栈中元素的函数-----*/
 25    char *p,*q;
 26    p=s.top;
 27    q=s.base;
 28    printf("The stack :");
 29ExpandedSubBlockStart.gifContractedSubBlock.gif    while(p!=q){
 30        printf("%c ",*(p-1));
 31        p--;
 32    }

 33    printf("\n");
 34}

 35
 36
 37ExpandedBlockStart.gifContractedBlock.gif/**//*==========================================================================*/
 38ExpandedBlockStart.gifContractedBlock.gif/**//*==========================对栈进行的操作==========================*/
 39ExpandedBlockStart.gifContractedBlock.gif/**//*==========================================================================*/
 40
 41ExpandedBlockStart.gifContractedBlock.gifint initstack(sqstack *s){         /**//*------构造一个空栈----*/
 42ExpandedSubBlockStart.gifContractedSubBlock.gif    s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));  /**//*--成员运算符的优先级高于指针运算符---*/
 43    s->base=s->top;
 44    if(!s->base)    return 0;
 45ExpandedSubBlockStart.gifContractedSubBlock.gif    s->stacksize=STACK_INIT_SIZE;/**//*=====顺序栈,初值不为0=====*/
 46    return 1;
 47}

 48
 49
 50
 51ExpandedBlockStart.gifContractedBlock.gifint destroystack(sqstack *s){      /**//*----------销毁栈-----------*/
 52    free(s->base);
 53ExpandedBlockStart.gifContractedBlock.gif}
                                 /**//*?????????????????destroystack与 clearstack的区别????????????????????*/
 54
 55ExpandedBlockStart.gifContractedBlock.gifint clearstack(sqstack*s){       /**//*----------清空栈-----------*/
 56    s->top=s->base;
 57}

 58
 59
 60
 61ExpandedBlockStart.gifContractedBlock.gifint stackempty(sqstack s){       /**//*----若空则返回 1 -------算法4*/
 62    if(s.top==s.basereturn 1;
 63    else    return 0;
 64}

 65
 66
 67
 68ExpandedBlockStart.gifContractedBlock.gifint stacklength(sqstack *s){   /**//*----------返回栈的元素个数----------*/
 69    int i=0;
 70    char *p,*q;
 71    p=s->top;
 72    q=s->base;
 73ExpandedSubBlockStart.gifContractedSubBlock.gif    while(p!=q){
 74        i++;
 75        p--;
 76    }

 77    return i;
 78}

 79
 80
 81
 82ExpandedBlockStart.gifContractedBlock.gifchar gettop(sqstack s){    /**//*----------用e返回栈顶元素的值-----------*/
 83    if(stackempty(s)) return 0;
 84    return *(s.top-1);
 85}

 86
 87
 88
 89ExpandedBlockStart.gifContractedBlock.gifint push(sqstack *s,char e){      /**//*---------压栈------------*/
 90ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//*若栈满,追加存储空间*/
 91    *(s->top++)=e;
 92    s->stacksize++;
 93}

 94
 95
 96
 97
 98ExpandedBlockStart.gifContractedBlock.gifint pop(sqstack *s,char *e){      /**//*---------若栈顶不为空,则删除栈顶元素------------*/
 99    if(s->top==s->base)  return 0;
100    *e=*(--s->top);
101    return 1;
102}

103
104
105
106
107ExpandedBlockStart.gifContractedBlock.gifint stacktraverse(sqstack s){    /**//*---------遍历一个栈------------*/
108    char *p;
109    p=s.top;
110ExpandedSubBlockStart.gifContractedSubBlock.gif    while(p!=s.base){
111        if(visit(!*p)) return 0;
112       p--;
113    }

114    return 1;
115}

116
117
118
119
120ExpandedBlockStart.gifContractedBlock.gif/**//*========================主函数部分=====================================*/
121
122
123
124ExpandedBlockStart.gifContractedBlock.gifmain(){
125    int i;
126    char *k=NULL,a='A',elem1,elem2;
127
128    sqstack *sa=NULL,stack;
129    sa=&stack;
130
131ExpandedSubBlockStart.gifContractedSubBlock.gif    initstack(sa);/**//*-------调用构造函数构造一个sa指向的空栈---------*/
132ExpandedSubBlockStart.gifContractedSubBlock.gif    for(i=1;i<=10;i++){
133ExpandedSubBlockStart.gifContractedSubBlock.gif        push(sa,a++);/**//*---------循环调用压栈函数向栈中压入10个元素------------*/
134    }

135    print(stack);
136
137ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//*----------gettop(*sa,&elem1)-----------*/
138            printf("The top elem of stack:%c \n",elem1=gettop(stack));
139
140ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//*----------stacklength(sa)-----------*/
141    printf("There are %d elements in this stack\n",stacklength(sa));
142
143
144    if(stacktraverse(*sa))  printf("dou shi da xie zi mu\n");
145    else printf("wu da xie zi mu\n");
146
147
148    k=&elem2;
149ExpandedSubBlockStart.gifContractedSubBlock.gif    pop(sa,k);     /**//*---------------------算法8*/
150            printf("After pop ,");
151            print(stack);
152            printf("There are %d elements in this stack\n",stacklength(sa));
153
154
155getch();
156}

157
158
159
160
161
162
163

 

转载于:https://www.cnblogs.com/LinderMan/archive/2009/07/25/1530751.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值