顺序栈的表示和实现

来源:互联网 发布:日本实景地图软件 编辑:程序博客网 时间:2024/05/02 20:15
#include <malloc.h>#include <stdlib.h>#include <stdio.h>#define stackinit 100#define stackincre 10#define overflow -2typedef int Selemtype;typedef struct {    Selemtype *base;    Selemtype *top;    int stacksize;} seqstack;int initstack(seqstack &s)   //构造一个空栈{     s.base=(Selemtype*)malloc(sizeof(Selemtype)*stackinit);     if (!s.base)         return 0;                   //存储分配失败     s.top=s.base;     s.stacksize=stackinit;     return 1; }int destroystack(seqstack &s)   //销毁栈s,s不再存在{    if (s.base)        free(s.base);    return 1;}int clearstack(seqstack &s)   //将s置为空栈{    s.top=s.base;    return 1;}int stackempty(seqstack s)    //若栈s为空栈,则返回1,否则返回0{    return s.top==s.base;}int stacklength(seqstack &s)   //返回s的元素个数,即栈的长度{    return s.top-s.base;}int gettop(seqstack s,Selemtype &e)     //若栈不空,则用e返回s的栈顶元素,否则返回0{    if (s.top==s.base)        return 0;    e=*(s.top-1);    return e;}int push(seqstack &s,Selemtype e)     //插入元素e为新的栈顶元素{    if (s.top-s.base >= stackinit){     //栈满,追加存储空间        s.base = (Selemtype*)realloc(s.base , (s.stacksize+stackincre)*sizeof(Selemtype));        if(!s.base)                     //存储分配失败            exit(overflow);        s.top= s.base + s.stacksize;        s.stacksize += stackincre;}    *(s.top++) = e;    return 1;}int pop(seqstack &s,Selemtype &e)   //若栈不空,则删除s的栈顶元素,用e返回其值,并返回1;否者返回0{                                   //是不是和前面的gettop函数有点像    if (s.top==s.base)        return 0;    e=*(--s.top);                   //区别在这    return 1;}int Print(int t) {                       printf (" %d", t);    return 1;}int stacktraverse(seqstack s,int (*visit)(Selemtype))   //从栈底到栈顶依次调用函数visit().一旦visit()失败,则操作失败{    Selemtype  *p;    p=s.base;    while  (p!=s.top)    {        visit(*p);                    //函数指针        p++;    }    return 1;}void conversion() {     //进制转换    seqstack S;    int N;    initstack(S);    scanf ("%d", &N);    while (N) {        push(S, N % 8);        N = N / 8;    }    int e;    while (!stackempty(S)) {        pop(S, e);        printf ( " %d", e);    }}int main () {    seqstack La;    printf("构造一个空栈中……\n");         initstack(La);    printf ("成功\n");    int n, e, i, top;    printf ("请输入要进栈的的个数:");    scanf ("%d", &n);    for (i=0; i<n; i++){        int temp;        printf ("输入入栈的的第%d个元素:\n", i+1);        scanf ("%d", &temp);        push(La, temp);    }    printf("本栈是空栈吗??\n");      if (stackempty(La) == 1)          printf("YES !!!\n");      else          printf("NO !!!\n");    printf("遍历:");    stacktraverse(La, Print);    puts("");    printf ("栈长:%d\n", stacklength(La));    top = gettop(La, e);    printf ("栈顶元素:%d\n", top);    push(La, 8);    printf("遍历:");    stacktraverse(La, Print);    puts("");    printf ("栈长:%d\n", stacklength(La));    pop(La, e);    printf("出栈的元素是:%d\n", e);      printf("元素出栈后事实上并没有清除,依然存在于内存空间,所谓的出栈只是指针移动,出栈的元素是%d\n",     *La.top);//判断出栈后元素是否还存在于内存中      printf ("开始清空栈……\n");    clearstack(La);    printf("现在栈中的元素是:\n");      stacktraverse(La, Print);    if(destroystack(La))        printf ("销毁成功\n");    else        printf ("你失败了\n");//    conversion();    return 0;}


原创粉丝点击