栈和队列(一)

文章目录

  • 顺序表,链表的有点和缺点
    • 链表
    • 顺序表
  • 栈和队列
    • 栈的实现
    • 栈的应用(括号匹配问题)

顺序表,链表的有点和缺点

链表

顺序表

栈和队列

栈的实现

#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
#include <assert.h>
//定义栈的类型
typedef int STDataType;typedef struct stack
{STDataType* a;int top;int capacity;
}ST;//函数接口的声明
void STInit(ST* pst);
void STDestory(ST* pst);
void STPush(ST* pst, STDataType x);
void STPop(ST* pst);
bool STEmpty(ST* pst);
int STSize(ST* pst);
STDataType STTop(ST* pst);

在对栈初始化时我们需要考虑top的值初始化为多少,如果初始化为-1指向的就是栈顶的元素,初始化为0指向的就是栈顶元素的下一个位置。
栈的接口实现:

#include "Stack.h"
void STInit(ST* pst)
{assert(pst);pst->a = NULL;pst->capacity = pst->top = 0;
}
void STDestory(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->capacity = pst->top = 0;
}
void STPush(ST* pst, STDataType x)
{assert(pst);//考虑扩容if (pst->capacity == pst->top){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;//当a为空指针时,realloc的作用和malloc的作用一样STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);if (tmp==NULL){perror("realloc failed");return;}pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top++] = x;
}
void STPop(ST* pst)
{assert(pst);assert(!STEmpty(pst));pst->top--;
}
bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}
int STSize(ST* pst)
{assert(pst);return pst->top;
}
STDataType STTop(ST* pst)
{assert(pst);assert(!STEmpty(pst));return pst->a[(pst->top) - 1];
}

栈的应用(括号匹配问题)

bool isValid(char * s){//首先初始化一个栈ST st;//初始化栈STInit(&st);while(*s){//遇到左括号进栈if(*s=='('||*s=='{'||*s=='['){STPush(&st,*s);}else   //遇到右括号,退栈{//如果此时的栈为空,即没有左括号,括号不匹配,返回falseif(STEmpty(&st)){STDestory(&st);return false;}char top = STTop(&st);STPop(&st);if((top=='('&&*s!=')')||(top=='{'&&*s!='}')||(top=='['&&*s!=']')){STDestory(&st);return false;}} s++;}//销毁栈bool ret = STEmpty(&st);STDestory(&st);if(ret){STDestory(&st);return true;}return false;
}

队列的实现见下一篇。

本文链接:https://my.lmcjl.com/post/1853.html

展开阅读全文

4 评论

留下您的评论.