• 定义栈的结构体

    typedef struct 
    {
        SElemType * base;//怎么base会关键字显示
        SElemType * top;
        int     stacksize;
    }SqStack;

    1.初始化一个空栈S

    Status InitStack(SqStack & S)
    {
        S.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
        if(!S.base)
            exit(OVERFLOW);
        S.top=S.base;
        S.stacksize=STACK_INIT_SIZE;
        return OK;
    }

    2.判断是否为空栈

    1 Status GetTop(SqStack S,SElemType & e)
    2 {
    3     if(S.top==S.base)
    4         return ERROR;
    5     e=*(S.top-1);
    6     return OK;
    7 }

    3.插入元素e为新的栈顶元素

    Status Push (SqStack & S ,SElemType e)
    {
        if(S.top -S.base>=S.stacksize)//栈满,追加存储空间
        {
            //重新分配存储空间
            S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)* sizeof(SElemType));
            if(!S.base)    //存储空间分配失败
                exit(OVERFLOW);
            S.top=S.base+S.stacksize;
            S.stacksize+=STACKINCREMENT;
        }
        *S.top++=e;
        return OK;
        
    }//Push

    4.删除栈顶元素,用e返回其值

    Status Pop(SqStack &S,SElemType &e)
    {
        if(S.top==S.base)
            return ERROR;
        e=*--S.top;
        return OK;
    }

    5.应用十进制转八进制

    void conversion()
    {
        InitStack(S);
        scanf("%d",&N);
        while(N)
        {
            Push(S,N%8);
            N=N/8;
        }
        while(!StackEmpty(S))
        {
            Pop(S,e);
            printf("%d",e);
        }
    }

    6.

    void LineEdit()
    {
        InitStack(S);    //构造空栈
        ch=getchar();    //从终端接受第一个字符
        while(ch!=EOF)    //EOF表示全文结束
        {
            while(ch!=EOF&&ch!='
    ')
            {
                switch(ch)
                {
                    case '#':Pop(S,c);
                    case '@':ClearStack(S);
                    default:Push(S,ch);
                }//switch
                ch=getchar();
            }//while
        }//while
    }//LineEdit

    7.走迷宫

    typedef struct 
    {
        int     ord;
        PosType seat;
        int     di;
    }SElemType;
    
    Status MazePath(MazeType maze,PosType start,PosType end)
    {
        InitStack(S);
        curpos=start;    //设定“当前位置”为入口位置
        curstep=1;        //探索第一步
        do
        {
            if(Pass(curpos))
            {
                FootPrint(curpos);        //留下足迹
                e=(curstep,curpos,1);
                Push(S,e);                //加入路径
                if(curpos==end)            //若到达终点出口
                    return TRUE;
                curpos=NextPos(curpos,1);//下一位置是当前位置的东邻
                curstep++;                //探索下一步
    
            }//if
            else                //当前位置不能通过
            {
                if(!StackEmpty(S))
                {
                    Pop(S,e);
                    while(e.di==4&&!StackEmpty(S))
                    {
                        MarkPrint(e.seat);
                        Pop(S,e);    //留下不能通过的标记,并退回一步
                    }//while
                    if(e.di<4)
                    {
                        e.di++;
                        Push(S,e);    //换下一个方向探索
                        curpos=NextPos(e.seat,e.di);//设定当前位置是该方向上得相邻块
                    }//if
                }//if
            }//else
        }while(!StackEmpty(S));
        return FALSE;
    }//MazePath

    8.运算优先级算法

    OperandType EvaluateExpression()
    {
        //设OPTR和OPND分别为运算符栈和运算数栈
        //OP为运算符集合
        InitStack(OPTR);
        Push(OPTR,'#');
        InitStack(OPND);
        c=getchar();
        while(c!='#'||GetTop(OPTR)!='#')//#是表达式的结束符
        {
            if(!In(c,OP))
            {            //不是运算符则进栈
                Push(OPND,c);
                c=getchar();
            }//if
            else
            {
                switch(Precede(GetTop(OPTR),c))
                {
                    case '<':Push(OPTR,c);//栈顶元素优先权低
                    c=getchar();break;
                    case '=':Pop(OPTR,x);//脱括号并接收下一个字符
                    c=getchar();break;
                    case '>':Pop(OPTR,theta);//退栈并将运算结果入栈
                    Pop(OPND,b);Pop(OPND,a);
                    Push(OPND,Operate(a,theta,b));break;
    
                }//switch
            }//else
        }//while
        return GetTop(OPND);
    }//EvaluateExpression
  • 相关阅读:
    TP连接数据库报错:SQLSTATE[HY000] [2002] No such file or directory (原)
    linux的查找命令 find whereis locate
    windows下cmd无法使用telnet命令解决方法 (原)
    CDN和智能DNS原理和应用 (原)
    面试:sql语句-1-基础查询
    面试问题:对框架的理解
    Hub,bridge,switch and router的区别
    If you ever have a broken heart
    virt-viewer的简单使用
    各种虚拟化镜像文件格式
  • 原文地址:https://www.cnblogs.com/droidxin/p/3626134.html
Copyright © 2020-2023  润新知