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