数据结构(三)——栈Stack

栈是一种特殊的线性表,插入和删除操作均在栈顶进行,插入操作称为入栈,删除操作称为出栈。

一、顺序栈

利用顺序存储方式实现的栈称为顺序栈,下面是它的一些基本操作实现算法,需要理解和记忆。

1.顺序栈的类型定义

#define StackSpaceIncr 20
typedef struct{
    SElemType *base;
    int top;
    int stackSize;
}SqStack;//顺序栈类型 

2.初始化操作InitSqStack(&S,InitSize)

Status InitSqStack( SqStack &S,int InitSize)
{
    S.base=(SElemType *)malloc(InitSize * sizeof(SElemType));
    if(!S.base) return OVERFLOW;//若失败
    S.stackSize=InitSize;
    S.top=0;//置为空栈
    return OK; 
} 

3.判空操作stackIsEmpty(S)

Status stackIsEmpty(SqStack S)
{
    if(!S.top) return TRUE;
    else return FALSE;
}

4.清空操作clearStack(&S)

void clearStack(SqStack &S)
{
    S.top=0;
}

5.求栈长操作stackLength(S)

int stackLength(SqStack S)
{
    return S.top;
}

6.入栈操作Push(&S,e)

Status Push(SqStack &S,SElemType e)
{
    SElemType * newBase;
    if(S.top==S.stackSize)
    {
        newBase=(SElemType *)realloc(S.base,(S.stackSize+StackSpaceIncr)*sizeof(SElemType));
        if(! newBase) return OVERFLOW;//失败 
        S.base=newBase;
        S.stackSize+=StackSpaceIncr;//成功 
    }
    S.base[S.top]=e;//插入元素e 
    S.top++;//栈顶指针top上移 
    return OK;
}

7.出栈操作Pop(&S,&e)

Status Pop(SqStack &S,SElemType &e)
{
    if(!S.top) return ERROR;//若失败 
    S.top--;//栈顶指针top下移 
    e=S.base[S.top];
    return OK;
} 

8.取栈顶操作getTop(S,&e)

Status getTop(SqStack S,SElemType &e)
{
    if(! S.top) return ERROR;
    e=S.base[S.top-1];
    return OK;
} 

二、链式栈

利用链式存储结构实现的栈称为链式栈,利用单链表实现链式栈时,其初始化、判空、清空、求长度操作都与单链表相同。

1.链式栈类型定义

#define StackSpaceIncr 20
typedef struct stackNode
{
    SElemType data;
    struct stackNode *next;
}*LinkStack;//链式栈类型 

2.初始化操作InitLinkStack(&S)

void InitLinkStack(LinkStack &S)
{
    //初始化为空 
    S=NULL;
}

3.入栈操作Push(&S,e)

Status Push(LinkStack &S,SElemType e)
{
    LinkStack p;
    p=(LinkStack)malloc(sizeof(struct stackNode));
    if(!p) return OVERFLOW;
    p->data=e;
    p->next=S;
    S=p;//在单链表的首端插入p结点 
    return OK; 
} 

4.出栈操作Pop(&S,&e)

Status Pop(LinkStack &S,SElemType &e)
{
    LinkStack p;
    if(!S) return ERROR;
    p=S;
    S=S->next;
    e=p->data;
    free(p);
    return OK;
} 

5.取栈顶操作getTop(S,&e)

Status getTop(LinkStack S,SElemType &e)
{
    if(! S) return ERROR;
    e=S->data;
    return OK; 
}

三、栈的实例——简单的括号匹配检验

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include "Status.h"
 4 typedef char SElemType;
 5 #include "SqStack.h"
 6 int bracketsCheck()
 7 {
 8     char ch;
 9     SqStack S;
10     InitSqStack(S,30);
11     ch=getchar();
12     while(ch!='\n')
13     {
14         if(ch=='(') Push(S,ch);
15         else if(ch==')')
16         {
17             if(!stackIsEmpty(S)) Pop(S,ch);
18             else return -1;
19         }
20         ch=getchar();
21     }
22     return stackLength(S);
23 }
24 int main()
25 {
26     int result;
27     printf("输入表达式串:\n");
28     result=bracketsCheck();
29     if(result==0) printf("括号匹配不正确!\n");
30     else if(result>0) printf("错误,缺%d个\')\'! \n",result);
31     else printf("错误,缺少1个或多个\'(\'!\n");
32     system("pause");
33     return 0; 
34 }

 

转载于:https://www.cnblogs.com/wxywxy/p/6849879.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值