关于数据结构中栈的若干使用

这个星期学习了有关于栈的相关知识以及栈的一些应用,故将其记录下来

关于栈的图示这里就不进行演示了,以下是有关于栈使用中的一些代码

首先是栈创建

struct sqstack{ //创建一个栈
    char base[MAXN];
    int top;
};
 sqstack mystack;

初始化

int initstack(sqstack &s){ 
        if(s.base==NULL) return 0;
        s.top=0;
        return 1;
}


进栈

int push(sqstack & s, char x){
        if(s.top>=maxn) return 0;
        s.base[s.top++]=x; //数据进栈后,top指针后移一位
        return 1;
}


出栈

int pop(sqstack &s ,char &e){
    if(s.top<=0) return 0;
    e=s.base[--s.top]; //top指针向前移一位,再拿出数据
    return 1;
}

判断是否是空栈

int isempty(sqstack &s){
    if(s.top==0) return 0;
    else return 1;
}


下面是栈的一些经典应用

1、利用栈进行括号表达式的匹配

int matchBracket(sqstack &s , char *bckstring){

    initstack(s);
    char tmp;
    int len=strlen(bckstring);
    for(int i=0;i<len;i++){

        char x=bckstring[i];
        if(x=='[' || x=='{' || x=='('){//如果是"[","{","(",也就是左括号就进栈
            push(s,x);
        }
        else if(x==']'){              //如果是右括号就从栈中弹出一个数据并进行判断
            if(!isempty(s)) return -2;
            pop(s,tmp);
            if(tmp!='[')
                return -1;
        }
        else if(x=='}'){
            if(!isempty(s)) return -2;
            pop(s,tmp);
            if(tmp!='{')
                return -1;
        }
        else if(x==')'){
            if(!isempty(s)) return -2;
            pop(s,tmp);
            if(tmp!='(')
                return -1;
        }
    }
    if(isempty(s)) return -3;
    return 0;
}

2、利用栈进行迷宫搜索,思路很简单,就是进行四个方向的搜索,找到了就继续找,并且将该位置入栈,找不到就换个方向进行找,如果找不到的话就将当前节点弹出,并且从其他方向进行查找,代码如下
void mysearch(int x,int y, sqstack &s){

    path tmp;
    int tmpx=x,tmpy=y;
    do{<//这里也可以用递归进行查找,不过递归所消耗的时间和空间相对来说会比较大
        int ok=1;
        mp[x][y]=1;
        tmp.x=x;
        tmp.y=y;
        push(s,tmp);
        if(x==n && y==n) break;
        if(y+1<=n){
            tmpx=x,tmpy=y+1;
            if(!mp[tmpx][tmpy]){
                    mp[x][y]=1;
                    ok=0;
                    y++;
            }
        }
         if(x+1<=n && ok){
                tmpx=x+1,tmpy=y;
                if(!mp[tmpx][tmpy]){
                    mp[x][y]=1;
                    ok=0;
                    x++;
                }
            }
         if(y-1>0 &&ok){
                tmpx=x,tmpy=y-1;
                if(!mp[tmpx][tmpy]){
                    ok=0;
                    mp[x][y]=1;
                    y--;
                }
            }
         if(x-1>0 && ok){
                tmpx=x-1,tmpy=y;
                if(!mp[tmpx][tmpy]){
                    mp[x][y]=1;
                    ok=0;
                    x--;
                }
            }
        if(ok) {
            if(isempty(s))
              {
                  pop(s);
                  path tmp= pop(s);
                  x=tmp.x;
                  y=tmp.y;
              }
            }
    }while(isempty(s));
}


进行表达式的计算

   stack<char> ep;
   stack<double> cnt;
void calc(char x){
    double ta=cnt.top(); cnt.pop();
    double tb=cnt.top(); cnt.pop();
    switch(x){
        case '+' : tb+=ta;break;
        case '-' : tb-=ta;break;
        case '*' : tb*=ta;break;
        case  '/': tb=tb*1.0/ta;break;
    }
    cnt.push(tb);
}

void transfer(string str){

    char x[20];
    while(!ep.empty()) ep.pop();
    while(!cnt.empty()) cnt.pop();

    int i=0,j=0;char ctmp;int itmp=0;double dtmp=0;

    char c=str[0];
    while(c!='#'){
        c=str[i];
        if(c>='0' && c<='9'){
            while((c>='0' && c<='9' ) || c=='.'){
                x[j++]=c;
                i++;
                c=str[i];
            }
            x[j]='\0';
            dtmp = atof(x);
            j=0;
            cnt.push(dtmp);
            //cout<<dtmp<<" ";
        }
        else if(c=='(' || c=='*' || c=='/'){
                    ep.push(c);
                    i++;
                }
        else if(c=='+' || c=='-'){
            if(ep.empty()) ep.push(c);
            else {
                do{
                        ctmp=ep.top();
                        if(ctmp=='('){
                            break;
                           }
                        else{
                            calc(ctmp);
                            ep.pop();
                        }

                }while(!ep.empty() && ctmp!='(');
                ep.push(c);
            }
            i++;
        }
        else if(c==')'){
            do{
                    ctmp=ep.top();
                    if(ctmp=='('){ep.pop(); break;}
                    else {
                        calc(ctmp);
                        ep.pop();
                    }

            }while(!ep.empty() && ctmp!='(');
            i++;
        }
        else if(c=='#') break;
    }
    while(!ep.empty()){
        calc(ep.top());
        ep.pop();
    }
}


未完待续。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值