首页 > 编程语言 >数据结构算法题

数据结构算法题

时间:2024-04-25 23:45:38浏览次数:32  
标签:Head return head next 链表 括号 算法 数据结构

数据结构算法题

通过键盘输入一个包括 '(' 和 ')' 的字符串string ,判断字符串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串需满足以下条件:

A.左括号必须用相同类型的右括号闭合。
B.左括号必须以正确的顺序闭合。
C.每个右括号都有一个对应的相同类型的左括号。

思路:

image

1.遍历字符串

2.创建链表

2。当遇到左括号存入链表,当遇到右括号左括号出栈

3.当出栈时检查到链表为空说明右括号多了,顺序不对,语法错误

4.当遍历完成之后,链表为空说明括号是配对的,字符串有效,否则说明左括号多了,字符串无效。

代码段

1.遍历字符串函数

/**********************************************************************************************
*   func name       : StrCheck
*   function        : Check whether string's bracket is right
*   func parameter  : 
*                       @str :string to be checked
*                       @Head :address of head node 
*   return resuolt  : Check result (true or false)
*   author          : liaojx2016@126.com
*   date            : 2024/04/25
*   note            : None
*   modify history  : None
*   function section: v1.0
*
**********************************************************************************************/
bool StrCheck(char *str,StackLList_t *head)
{
    bool flag=1;    //定义一个标志,用于返回检查结果
    //遍历字符,找出括号
    while (*str)
    {       
        //当字符为左括号,将其存入链表
        if (*str=='(')  {
            Stack_Push(*str,head);
        }
        //当字符为右括号,出栈
        if (*str==')')   {
            flag=Stack_Pop(head);
        }
        //当链表中没有结点,且字符为右括号,字符串语法错误,结束函数并返回0
        if (flag==0)    {
            return false;
        }
        str++;
    }
    //遍历完字符串之后,判断链表是否为空,若为空,表示语法正确,flag置1,若非空,则语法错误,flag置0。
    flag=Stack_IsEmpty(head);
    return flag; 
}

2.入栈函数

/**********************************************************************************************
*   func name       : StackLList_Push
*   function        : Do stack push for left bracket
*   func parameter  : 
*                       @ch :Push charactor to stack
*                       @Head :Address of head node
*   return resuolt  : Stack push success result (true or false)
*   author          : liaojx2016@126.com
*   date            : 2024/04/25
*   note            : None
*   modify history  : None
*   function section: v1.0
*
**********************************************************************************************/
bool Stack_Push(char ch,StackLList_t *Head)
{
    //1.创建新的结点,并对新结点进行初始化
	StackLList_t *New = StackLList_NewNode(ch);
	if (NULL == New)
	{
		printf("can not insert new node\n");
		return false;
	}
	//2.判断链表是否为空,如果为空,则直接插入即可
	if (NULL == Head->next)
	{
		Head->next = New;
		return true;
	}

	//3.如果链表为非空,则把新结点插入到链表的头部
	New->next  = Head->next;
	Head->next = New;
	return true;
}

3.出栈函数

/**********************************************************************************************
*   func name       : Stack_Pop
*   function        : Stack pop for one charactor
*   func parameter  : 
*                       @Head :address of head node 
*   return resuolt  : Stack pop success result (true or false)
*   author          : liaojx2016@126.com
*   date            : 2024/04/25
*   note            : None
*   modify history  : None
*   function section: v1.0
*
**********************************************************************************************/
bool Stack_Pop(StackLList_t *Head)
{
    //当链表为空,删除失败,返回false
    if (NULL == Head->next)
	{
		//printf("Stack linklist is empty\n");
		return false;
	}
    StackLList_t *Delnode=Head->next;   //备份首结点
    //printf("next=%#x\n",Head->next->next);
    //printf("the push element data is %d\n",Head->next->ch);
    //首部删除一个节点
    Head->next=Head->next->next;
    Delnode->next=NULL;
    free(Delnode);
    return true;
}

4.判断链表为空

/**********************************************************************************************
*   func name       : Stack_IsEmpty
*   function        : Judge whether stack is empty
*   func parameter  : 
*                       @Head :address of head node 
*   return resuolt  : Check stack empty result (if empty,reture true.if not return false)
*   author          : liaojx2016@126.com
*   date            : 2024/04/25
*   note            : None
*   modify history  : None
*   function section: v1.0
*
**********************************************************************************************/
bool Stack_IsEmpty(StackLList_t *head)
{
    if (head->next==NULL)   
        return true;
    else 
        return false;
}

5.主函数

int main(int argc, char const *argv[])
{
    char *str="(j(k)ld)fd(((&)))))";
    //创建一个链表,存储左括号
    StackLList_t *head=StackLList_Create();
    printf("the words is %s\n",str);
    //判断字符串的括号是否符合语法
    //当检查函数返回1,则字符串语法正确,否则输出语法错误
    if (1==StrCheck(str,head))  {
        printf("the words is valid! \n");
    }
    else
        printf("the words is not valid!!!\n");

    return 0;
}

测试输出结果
image

标签:Head,return,head,next,链表,括号,算法,数据结构
From: https://www.cnblogs.com/JinBool/p/18158935

相关文章

  • KNN算法思想与Python实现
    古语说得好,物以类聚,人以群分;近朱者赤,近墨者黑。这两句话的大概意思就是,你周围大部分朋友是什么人,那么你大概率也就是这种人,这句话其实也就是K最近邻算法的核心思想。kNN(k-NearestNeighbor)法即k最邻近法,最初由Cover和Hart于1968年提出,是一个理论上比较成熟的方法,也是最简单的机......
  • C语言数据结构:顺序栈的创建、出入栈,以及使用顺序栈实现十进制转十六进制
    /***********************************************************************************************************该程序实现顺序栈元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以顺序栈中元素的*数据类型为DataType_t,用户可以根据实际情况修改......
  • 基于c语言数据结构-双循环链表
    DoubleCircularLinkedList双循环链表/**************************************************************函数名称:*函数功能:设计双向循环链表的接口*函数参数:*返回结果:*注意事项:None*函数作者:zcx982795194@163@163.com*创建日期:2024/04/25*修......
  • 数据结构(顺序表)
    /***********************************************************************************************************该的程序实现顺序表元素增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以顺序表中元素的*数据类型为DataType_t,用户可以根据实际情况修改顺序......
  • 数据结构(顺序栈元素的增删改查)
    /***********************************************************************************************************该程序实现顺序栈元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以顺序栈中元素的*数据类型为DataType_t,用户可以根据实际情况修改顺序......
  • 数据结构_链表_单向循环链表的初始化、插入、删除、修改、查询打印(基于C语言实现)
    版本:2024年4月25日V1.0发布于博客园/***@filename:CircularLinkedList.c*@brief:实现单向循环链表的相关功能*@author:RISE_AND_GRIND@163.com*@date:2024/04/25*@version:1.1*@note:*CopyRight(c)2023-2024RISE_A......
  • 数据结构——双向循环链表
    二、双向循环链表(一)双向循环链表的构造双向循环链表的首结点中的prev指针成员指向链表的尾结点,并且双向循环链表的尾结点里的next指针成员指向链表的首结点,所以双向循环链表也属于环形结构。1)构造双向循环链表的结点//双向链表中的结点有效数据类型,用户可以根据需要进行修......
  • 36天【代码随想录算法训练营34期】第八章 贪心算法 part05( ● 435. 无重叠区间 ● 7
    435.无重叠区间classSolution:deferaseOverlapIntervals(self,intervals:List[List[int]])->int:count=0intervals.sort(key=lambdax:x[0])foriinrange(1,len(intervals)):ifintervals[i][0]<intervals[i-......
  • 数据结构:顺序栈的创建·插入·删除
    数据结构:顺序栈的创建·插入·删除目录数据结构:顺序栈的创建·插入·删除栈的原理设计思路代码栈的原理​ 栈(stack),存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈(PUSH)、出栈(POP)的说法。闭合的一端被称为栈......
  • 使用 Redis 实现限流——滑动窗口算法
    用Go语言实现滑动窗口限流算法,并利用Redis作为存储后端,可以按照以下步骤进行设计和编码。滑动窗口限流的核心思想是维护一个固定时间窗口,并在窗口内记录请求次数,当窗口滑动时,旧的请求计数被移除,新的请求计数被添加。这里以Redis的有序集合(SortedSet,简称ZSet)作为数据结构,因......