数据结构---栈

1. 概要

栈类型

1.满减栈

2,满增栈

3,空减栈

4.空增栈 1

满栈:top指示的是,最后一次入栈的元素

空栈:top指示的是,新元素待插的位置

增栈:随着元素的push,top地址变大

减栈,随着元素的push,top地址变小

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

先进后出、后进先出

栈顶:允许操作的一端

栈底:不允许操作的一端

入栈,出栈。

顺序栈 链式栈

30+2\5

1.创建 CreateSeqStack

2.销毁 DestroySeqStack

3.判断是否为空栈 IsEmptySeqStack

4.判断是否为满栈 IsFullSeqStack

5.压栈 PushSeqStack

6.出栈 PopSeqStack

2. 顺序栈 

seqstack.h

#ifndef _SEQSTACK_H_ 
#define _SEQSTACK_H_  
typedef struct person {
        char name[32];
        char sex;
        int age;
        int score;
}DATATYPE;
typedef struct list {
        DATATYPE *head;
        int tlen;
        int top;
}SeqStack;


SeqStack* CreateSeqStack(int len);
int DestroySeqStack(SeqStack* ss);
int PushSeqStack(SeqStack* ss, DATATYPE* data);
int PopSeqStack(SeqStack*ss);
DATATYPE* GetTopSeqStack(SeqStack* ss);
int IsEmptySeqStack(SeqStack* ss);
int IsFullSeqStack(SeqStack* ss);
int GetSizeSeqStack(SeqStack*ss);

#endif

seqstack.c

#include "seqstack.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

SeqStack* CreateSeqStack(int len)
{
    SeqStack* ss = (SeqStack*)malloc(sizeof(SeqStack));
    if(NULL == ss)
    {
        perror("CreateSeqStack malloc 1");
        return NULL;
    }

    ss->head =(DATATYPE*) malloc(sizeof(DATATYPE)*len);
    if(NULL == ss->head )
    {
        
        perror("CreateSeqStack malloc 1");
        return NULL;
    }
    ss->tlen  = len;
    ss->top =  0;
    return ss;
}
int PushSeqStack(SeqStack* ss, DATATYPE* data)
{

    if(IsFullSeqStack(ss))
    {
        return 1;
    }
    memcpy(&ss->head[ss->top++],data,sizeof(DATATYPE));
    return 0;
}
int PopSeqStack(SeqStack*ss)
{
    if(IsEmptySeqStack(ss))
    {
        return 1;
    }
    ss->top--;
    return 0;
}

int IsFullSeqStack(SeqStack* ss)
{
    return ss->top  == ss->tlen ;
}
int IsEmptySeqStack(SeqStack* ss)
{
    return 0 == ss->top ;
}
DATATYPE* GetTopSeqStack(SeqStack* ss)
{
    if(IsEmptySeqStack(ss))
    {
        return NULL;
    }
    return &ss->head[ss->top -1];
}
int GetSizeSeqStack(SeqStack*ss)
{
    return ss->top;
}

main.c

#include "seqstack.h"
#include <stdio.h>


int main(int argc, char *argv[])
{
    SeqStack* ss = CreateSeqStack(10);
    

     DATATYPE data[]={
        {"zhansan",'m',20,90},
        {"lisi",'f',22,87},
        {"wangmazi",'m',21,93},
        {"guanerge",'m',40,60},
        {"liuei",'m',42,83},
    };

     int  i = 0 ;
     for(i = 0 ;i<5;i++)
     {
        PushSeqStack(ss,&data[i]);
     }
    int len  =GetSizeSeqStack(ss);

    for(i=0;i<len;i++)
    {
    
        DATATYPE* tmp = GetTopSeqStack(ss);
        printf("%s %d\n",tmp->name,tmp->score);
        PopSeqStack(ss);
    }

    return 0;
}

3. 链式栈

linkstack.h

#ifndef _LINKSTACK_H_ 
#define _LINKSTACK_H_

typedef struct {
        char name[32];
        char sex;
        int age;
        int score;
}DATATYPE;

typedef struct stack_node {
        DATATYPE data;
        struct stack_node *next;
}LinkStackNode;

typedef struct  {

    LinkStackNode* top;
        int clen;
}LinkStackList;


LinkStackList* CreateLinkStack();
int DestroyLinkStackList(LinkStackList**ls);
int PushLinkStack(LinkStackList* ls, DATATYPE*data);
int PopLinkStack(LinkStackList*ls);
DATATYPE* GetTopLinkStack(LinkStackList*ls);
int IsEmtpyLinkStack(LinkStackList* ls);
int GetSizeLinkStack(LinkStackList*ls);

#endif

linkstack.c

#include "linkstack.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
LinkStackList* CreateLinkStack()
{
    LinkStackList* ls = (LinkStackList*)malloc(sizeof(LinkStackList));
    if(NULL == ls)
    {
        perror("CreateLinkStack malloc");
        return NULL;
    }
    ls->top = NULL;
    ls->clen = 0 ;
    return ls;
}
int DestroyLinkStackList(LinkStackList**ls)
{
    int len = GetSizeLinkStack(*ls);
    int i = 0 ;
    for(i = 0 ;i<len;i++)
    {
        PopLinkStack(*ls);
    }

    free(*ls);
    *ls =NULL;
    return 0;
}
int PushLinkStack(LinkStackList* ls, DATATYPE*data)
{
    LinkStackNode* newnode = (LinkStackNode*)malloc(sizeof(LinkStackNode));
    if(NULL == newnode)
    {
        perror("PushLinkStack malloc");
        return 1;
    }
    memcpy(&newnode->data ,data,sizeof(DATATYPE));
    newnode->next = NULL;
    if(IsEmtpyLinkStack(ls))
    {
    
        ls->top = newnode;
    }
    else 
    {
        newnode->next = ls->top ;
        ls->top = newnode;
    }
    ls->clen ++;
    return 0;


}
int PopLinkStack(LinkStackList*ls)
{
    if(IsEmtpyLinkStack(ls))
    {
        return 1;
    }
    LinkStackNode* tmp = ls->top ;
    ls->top = ls->top ->next ;
    free(tmp);
    ls->clen --;
    return 0;
}
DATATYPE* GetTopLinkStack(LinkStackList*ls)
{
    if(IsEmtpyLinkStack(ls))
    {
        return NULL;
    }
    return &ls->top->data ;
}
int IsEmtpyLinkStack(LinkStackList* ls)
{
    return  0 == ls->clen ;
}
int GetSizeLinkStack(LinkStackList*ls)
{
    return ls->clen ;
}

main.c

#include "linkstack.h"
#include <stdio.h>

int main(int argc, char *argv[])
{
     DATATYPE data[]={
        {"zhansan",'m',20,90},
        {"lisi",'f',22,87},
        {"wangmazi",'m',21,93},
        {"guanerge",'m',40,60},
        {"liuei",'m',42,83},
    };

    LinkStackList* ls = CreateLinkStack();

    int i = 0 ;
    for(i = 0 ;i<5;i++)
    {
        PushLinkStack(ls,&data[i]);
    }

    int len = GetSizeLinkStack(ls);
    for(i = 0 ;i<len;i++)
    {
    
        DATATYPE* tmp = GetTopLinkStack(ls);
        printf("%s %d\n",tmp->name ,tmp->score );

        PopLinkStack(ls);
    }

    DestroyLinkStackList(&ls);
    return 0;
}

4.  练习

()【】{} 的配对 -------使用的是顺序栈

#ifndef _SEQSTACK_H_ 
#define _SEQSTACK_H_  

typedef struct{

    char sym;
    int row;
    int col;
}DATATYPE;
typedef struct list {
        DATATYPE *head;
        int tlen;
        int top;
}SeqStack;

SeqStack* CreateSeqStack(int len);
int DestroySeqStack(SeqStack* ss);
int PushSeqStack(SeqStack* ss, DATATYPE* data);
int PopSeqStack(SeqStack*ss);
DATATYPE* GetTopSeqStack(SeqStack* ss);
int IsEmptySeqStack(SeqStack* ss);
int IsFullSeqStack(SeqStack* ss);
int GetSizeSeqStack(SeqStack*ss);

#endif
seqstack.c

#include "seqstack.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

SeqStack* CreateSeqStack(int len)
{
    SeqStack* ss = (SeqStack*)malloc(sizeof(SeqStack));
    if(NULL == ss)
    {
        perror("CreateSeqStack malloc 1");
        return NULL;
    }

    ss->head =(DATATYPE*) malloc(sizeof(DATATYPE)*len);
    if(NULL == ss->head )
    {
        
        perror("CreateSeqStack malloc 1");
        return NULL;
    }
    ss->tlen  = len;
    ss->top =  0;
    return ss;
}
int PushSeqStack(SeqStack* ss, DATATYPE* data)
{

    if(IsFullSeqStack(ss))
    {
        return 1;
    }
    memcpy(&ss->head[ss->top++],data,sizeof(DATATYPE));
    return 0;
}
int PopSeqStack(SeqStack*ss)
{
    if(IsEmptySeqStack(ss))
    {
        return 1;
    }
    ss->top--;
    return 0;
}

int IsFullSeqStack(SeqStack* ss)
{
    return ss->top  == ss->tlen ;
}
int IsEmptySeqStack(SeqStack* ss)
{
    return 0 == ss->top ;
}
DATATYPE* GetTopSeqStack(SeqStack* ss)
{
    if(IsEmptySeqStack(ss))
    {
        return NULL;
    }
    return &ss->head[ss->top -1];
}
int GetSizeSeqStack(SeqStack*ss)
{
    return ss->top;
}
main.c

#include "seqstack.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int do_check(char *buf,SeqStack* ss,int row)
{   
    DATATYPE data;
    int col =1;
    DATATYPE* tmp=NULL;
    while(*buf)
    {
        //memset(&data,0,sizeof(data));
        bzero(&data,sizeof(data));
        switch(*buf)
        {
        case '(':
            data.sym = *buf;
            data.row = row;
            data.col = col;
            PushSeqStack(ss,&data);
            break;
        case '[':
            data.sym = *buf;
            data.row = row;
            data.col = col;
            PushSeqStack(ss,&data);
            break;
        case '{':
            data.sym = *buf;
            data.row = row;
            data.col = col;
            PushSeqStack(ss,&data);
            break;

        case ')':
            tmp= GetTopSeqStack(ss);
            if(NULL == tmp)
            {
               printf("buf sym:%c row:%d col:%d\n",*buf,row,col); 
               return 1;
            }
            if('('==tmp->sym )
            {
                PopSeqStack(ss);
            }
            else 
            {

                printf("1.top error sym:%c row:%d col:%d or 2 buf sym:%c row:%d col%d\n",
                       tmp->sym ,tmp->row ,tmp->col,*buf,row,col ); 
                return 1;
            }
            break;
        case ']':
            tmp= GetTopSeqStack(ss);
            if(NULL == tmp)
            {
               printf("buf sym:%c row:%d col:%d\n",*buf,row,col); 
               return 1;
            }
            if('['==tmp->sym )
            {
                PopSeqStack(ss);
            }
            else 
            {

                printf("1.top error sym:%c row:%d col:%d or 2 buf sym:%c row:%d col%d\n",
                       tmp->sym ,tmp->row ,tmp->col,*buf,row,col ); 
                return 1;
            }
            break;
        case '}':
            tmp= GetTopSeqStack(ss);
            if(NULL == tmp)
            {
               printf("buf sym:%c row:%d col:%d\n",*buf,row,col); 
               return 1;
            }
            if('{'==tmp->sym )
            {
                PopSeqStack(ss);
            }
            else 
            {

                printf("1.top error sym:%c row:%d col:%d or 2 buf sym:%c row:%d col%d\n",
                       tmp->sym ,tmp->row ,tmp->col,*buf,row,col ); 
                return 1;
            }
            break;
        }
        buf++;
        col++;
    }

    return 0;
}
int main(int argc, char *argv[])
{
    SeqStack* ss = CreateSeqStack(50);  

    FILE* fp = fopen("/home/linux/1.c","r");
    if(NULL == fp)
    {
        perror("fopen");
        exit(1);
    }
    int flag =  0;
    int row =1;
    while(1)
    {
        char buf[512]={0};
        if(fgets(buf,sizeof(buf),fp))
        {
            int ret = do_check(buf,ss,row);
            if(ret!= 0 )
            {
                flag = 1;
                break;
            }
        }
        else 
        {
            break;
        }

        row++;
    }

    if(1 == flag)
    {
        return 0;
    }
    else 
    {
        if(IsEmptySeqStack(ss))
        {
            printf("ok!");
        }
        else 
        {
            DATATYPE* tmp = GetTopSeqStack(ss);
            printf("%c row:%d col:%d\n",tmp->sym 
                   ,tmp->row ,tmp->col);
        }
    }
    return 0;
}

  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值