数据结构算法题
通过键盘输入一个包括 ‘(‘ 和 ‘)’ 的字符串string ,判断字符串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串需满足以下条件:
A.左括号必须用相同类型的右括号闭合。
B.左括号必须以正确的顺序闭合。
C.每个右括号都有一个对应的相同类型的左括号。
思路:
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;
}
测试输出结果
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容