顺序栈和链栈以及他们的应用

顺序栈和链栈以及他们的应用

一、什么是栈

  • 只允许在一端插入和删除的线性表
  • 允许插入和删除的一端称为栈顶 (top),另一端称 为栈底(base)
  • 特点:后进先出 (LIFO, Last In, First Out)

在这里插入图片描述

二、顺序栈

2.1 顺序栈的顺序存储表示

#define  STACK_INIT_SIZE  100
#define  STACKINCREMENT   10 
  typedef struct {
    SElemType  *base;    
    SElemType  *top;  
    int  stacksize;    
  } SqStack;

2.2 顺序栈的初始化

Status InitStack (SqStack &S)
{// 构造一个空栈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.3 返回顺序栈顶元素

Status GetTop (SqStack S, SElemType &e) {
     // 若栈不空, 用e返回栈顶元素,并返回 //OK; 否则返回ERROR
    if (S.top = = S.base) return ERROR;
    e = *(S.top-1);
    return OK;
}//GetTop

2.4 压栈

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;
}

2.5 出栈

Status Pop (SqStack &S, SElemType &e) {
     // 若栈不空,则删除S的栈顶元素,
     // 用e返回其值,并返回OK;
     // 否则返回ERROR
    if (S.top = = S.base) return ERROR;
    e = *--S.top;
    return OK;
}

三、链栈

typedef   struct LinkNode 
{   SElemType         	data;
     struct LinkNode  	*link;
}LinkNode, *LinkStack;

四、栈的应用

4.1 数制转换

算法基于原理:	  N = (N div d)×d + N mod d  

例如:(1348)10 = (2504)8 ,其运算过程如下:

在这里插入图片描述

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 );
    }
} // conversion

4.2 括号匹配的检验

假设在表达式中
([]())或[([ ][ ])]
等为正确的格式,
[( ])或([( ))或 (()])
均为不正确的格式。

算法思想:

  1. 凡出现左括弧,则进栈;
  2. 凡出现右括弧,首先检查栈是否空?
    • 若栈空,则表明该“右括弧”多余,
    • 否则和栈顶元素比较,
      • 若相匹配,则“左括弧出栈” ,
      • 否则表明不匹配。
  3. 表达式检验结束时,
    • 若栈空,则表明表达式中匹配正确,
    • 否则表明“左括弧”有余。
public boolean isValid(String s) {
        Stack stack = new Stack();
        char string[] = s.toCharArray();
        int index = 0;//指向栈判断到哪一位了
        if(string.length==0)
            return true;
        while(index<string.length)
        {
            if(string[index]==' ')
            {
                index++;
                continue;
            }
            char ithis = string[index];
            if(string[index]=='('||string[index]=='['||string[index]=='{')
                stack.push(string[index]);
            else
            {
                if(stack.empty()==true)
                {
                    return false;
                }
                char temp = (char)stack.pop();
                if(string[index]==')'&&temp!='(' ||string[index]==']'&&temp!='[' ||string[index]=='}'&&temp!='{')
                {
                    return false;
                }
            }
            index++;
        }
        if(stack.empty()==true)
            return true;
        else
            return false;




    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值