【C数据结构】栈的归纳

在这里插入图片描述这两天没来得及更,在看数据库的一些东西,发现简直要学的太多了…果然,我就是条懒狗。
—————————————————————————————————————————————

抽象数据类型栈的定义

栈是限定仅在表尾进行插入或删除操作的线性表

  • 原则:LIFO(last in first out)后进先出
    示意图
    栈的基本操作除了在栈顶进行插入或者删除外,还有栈的初始化,判空及取栈顶元素等。

栈的表示与实现

  • 栈和线性表类似,有两种存储方式:
    顺序栈:利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素
    链栈:链栈的定义和线性表一样,只不过只能在栈顶进行操作

模块说明

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

栈的初始化

Status initStack(SqStack &s)
{

  s.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));//开辟动态内存
  //(SElemType*)把void*类型指针转换为(SElemType*)类型
  //((STACK_INIT_SIZE)*sizeof(SElemType))是指分配STACK_INIT_SIZE个像SElemType这么大的内存
  //相当于假如STACK_INIT_SIZE=100;sizeof(int)=4;所以实际要分配100*4=400个字节的内存
  if(!s.base) exit(OVERFLOW);
  s.top=s.base;
  s.stacksize=STACK_INIT_SIZE;
  return OK;
}

入栈

Status push(SqStack &s,SElemType e)
{
  if(s.top-s.base>=s.stacksize)//如果栈满,则追加存储空间(栈顶指针-栈底指针得到栈中元素个数,如果该值大于等于栈容量说明栈满)
  //以下为若栈满,追加存储空间的代码
  {
    s.base=(SElemType*)realloc(s.base,(s.stacksize+STACK_INCREMENT)*sizeof(SElemType));
    if(!s.base) exit (OVERFLOW);
    s.top=s.base+s.stacksize; //栈顶指针=栈底指针 + 栈容量
    s.stacksize+=STACK_INCREMENT; //栈容量 = 原先栈容量 + 新增内存空间
  }
  //以上为若栈满,追加存储空间的代码
  *s.top++=e;//先将需要插入的元素赋值给栈顶指针所指位置,栈顶指针再向上移动一个单位
  return OK;
}

出栈

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

取栈顶元素

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

栈容量

int getStackElemNum(SqStack s)
{
  if(s.top==s.base) return 0;
  return(s.top-s.base);

判断是否空栈

Status isEmpty(SqStack s)
{
  if(s.top==s.base)
  return TRUE;
  else
  return FALSE;
}

栈的应用

数制转换

N=(N div d) x d +N mod d (短除法)
div为整除,mod为求余

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

括号匹配

bool matching(char exp[])
{
  int state=1;
  ch=*exp++;
  while(ch!='#'&& state)
  {
    switch(ch)
    {
      case '(':case '[':
      {
        Push(S,ch); 
        break;
      }
      case ')':
      {
        if(!StackEmpty(S) && GetTop(S)=='(')
        Pop(S,e);
        else state=0 break;
      }
      case '[':
      {
        if(!StackEmpty(S) && GetTop(S)=='[')
        Pop(S,e);
        else state=0 break;
      }
      ch=*exp++;
    }
    case ')':
    {
      if(!StackEmpty(S) && GetTop(S)=='(')
      {
        Pop(S,e)
        else state=0 break;
      }
    }
    case ']':
    {
      if(StackEmpty(S) && GetTop(S)=='[')
      {
        Pop(S,e)
        else state=0 break;
      }
    }
    ch=*exp++;
  }
  if(state && StackEmpty(S)) return true;
  else return false;
}

表达式求值

中缀后缀
a * b + ca b * c +
a+(b*c+d)a b c * d + e / +
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值