云计算百科
云计算领域专业知识百科平台

震惊小学生竟会手撕顺序栈?

  在前面我们已经学会了顺序表,而顺序栈对于顺序表而言就是删除了顺序表中的一些结构,因为栈是“先进后出”,它就像一个水瓶一样,我们往瓶中放石头,最先放下去的石头总是最后才能拿出来,因此我们把水瓶比作一个栈的话,瓶底就是栈底,瓶口就是栈顶,我们入栈和出栈都是在栈顶进行,因此,我们的思路有很明确,在顺序表的基础上,删除一些结构就能达到栈的效果。下面将从四个方面代大家写栈的代码,首先第一个方面构建栈,第二入栈,第三出栈,第四利用栈写圆括号匹配的问题。

第一部分构建栈

        构建栈的思想还是和顺序表一样,栈是有栈顶+栈底+栈里面的元素的容量,因此我们构建一个结构体来进行管理,然后对栈进行初始化的动作。

typedef struct SeqStack
{
datatype_t *bottom;//栈的元素
unsigned int Size;//栈的容量
int Top;//顺序栈的最后一个有效元素的下标
}SeqStack_t;

//1.创建顺序栈并初始化
SeqStack_t * SeqList_Creat(datatype_t Size){
//1.申请堆内存创建顺序栈并进行错误检查,用calloc申请,创建一个结构体管理员
SeqStack_t *manager=calloc(1,sizeof(manager));
if (NULL == manager)
{
printf("申请失败");
exit(-1);
}

//2.为结构体中的所有元素申请堆内存
manager->bottom=(datatype_t *)calloc(Size,sizeof(datatype_t));
if (NULL ==manager->bottom)
{
printf("申请失败\\n");
free(manager);
exit(-1);
}

//3.为机构体的其它元素申请内存
manager->Size=Size;
manager->Top=-1;
return manager;
}

第二部分入栈

        入栈操作就是把元素压入栈底,我们以数组为例,数组的下标最开始的地方是栈底,我们需要把元素一个一个的压入到里面,因此我们每压入一个元素,数组的下标就要加一。

//判断顺序栈是否是满的
bool SeqStack_Isfull(SeqStack_t*manager){

return (manager->Top+1==manager->Size)?true:false;

}

//入栈
bool SeqStack_PUSH(SeqStack_t *manager,datatype_t data){

if (SeqList_Isfull(manager))
{
printf("此顺序表容量已经满了,无法再继续添加元素");
return false;
}
manager->bottom[++manager->Top]=data;
return true;

}

第三部分出栈

        出栈的操作就是从栈顶取出数组中的元素,从数组中最后一个元素开始取,然后减小数组的下标。

//判断顺序栈中是否有元素
bool SeqStack_IsEmpty(SeqStack_t *manager){

return (-1==manager->Top)?true:false;

}

//3.出栈
bool SeqStack_Pop(SeqStack_t *manager){

//1.要出栈中的元素首先应该判断栈中是否有元素
if (SeqList_IsEmpty(manager))
{
printf("此顺序表中无元素可以删除");
return false;
}
manager->bottom[manager->Top]=0;
manager->Top–;
return true;

}

关于圆括号匹配的问题

关于圆括号匹配,我们可以当我们遇到第一个左括号的时候入栈,然后遇到右括号的时候出栈,利用这个思想进行括号匹配。

int main(int argc, char const *argv[])
{
char *s=(char *)calloc(100,sizeof(char));

SeqStack_t *p=SeqList_Creat(10);
scanf("%s",s);
for (int i = 0; s[i]!='\\0'; i++)
{
if (s[i]=='(')
{
SeqStack_PUSH(p,s[i]);
}
if (s[i]==')')
{
SeqStack_Pop(p);
}

}

return 0;
}

代码有许多细节问题没处理,欢迎广大网友在评论区发言。

赞(0)
未经允许不得转载:网硕互联帮助中心 » 震惊小学生竟会手撕顺序栈?
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!