PTA 6-11 括号匹配(数据结构)

本题要求通过栈来判断括号匹配问题,如果匹配输出yes!,否则输出no!

函数接口定义:

void BracketMatch(LinkStack top)

其中,top是栈顶

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

typedef int DataType;
struct Node {
    DataType      data;
    struct Node*  next;
};
typedef struct Node  *PNode;
typedef struct Node  *LinkStack;

LinkStack SetNullStack_Link()  
{
    LinkStack top = (LinkStack)malloc(sizeof(struct Node));
    if (top != NULL) top->next = NULL;
    else printf("Alloc failure");
    return top;  
}

int IsNullStack_link(LinkStack top) 
{
    if (top->next == NULL)
        return 1;
    else
        return 0;
}

void Push_link(LinkStack top, DataType x) 
{
    PNode p;
    p = (PNode)malloc(sizeof(struct Node));
    if (p == NULL)
        printf("Alloc failure");
    else
    {
        p->data = x;
        p->next = top->next;
        top->next = p;
    }
}
void Pop_link(LinkStack top)
{
    PNode p;
    if (top->next == NULL)
        printf("it is empty stack!");
    else
    {
        p = top->next;
        top->next = p->next;
        free(p);
    }
}
DataType Top_link(LinkStack top)
{
    if (top->next == NULL)
    {
        printf("It is empty stack!");
        return 0;
    }
    else
        return top->next->data;
}

void BracketMatch(LinkStack top)
{
    @@
}
int main()
{
    LinkStack mystack = NULL;
    mystack = SetNullStack_Link();
    BracketMatch(mystack);
    return 0;
}

输入样例:

(())#

输出样例:

yes!

输入样例:

(()#

输出样例:

no!

代码实现(C语言)

void BracketMatch(LinkStack top)
{
    
    char str,str1;
    int flag=0;
    
	scanf("%c",&str);
	
	if(str=='(')
	{
		Push_link(top, str); 
		flag++;
	}
	else
	{
		printf("no!\n");
		exit(0);
	}
	
	while(str!='#')
	{
		scanf("%c",&str);
        
		if(str==')')
		{
			str1=Top_link(top);
			Pop_link(top);
            
			if(str1=='('&&str==')')
				flag--;
			else
			{
				printf("no!\n");
				exit(0);	
			}	
		}
		else if(str=='(')
		{
			Push_link(top,str); 
			flag++;
		}
	}
    
	if(flag==0)
		printf("yes!\n");
	else
		printf("no!\n");	
}

好的,我可以为你解答这个问题。 根据带虚结点的先序序列创建二叉树的步骤如下: 1. 读入先序序列,包括虚结点和实结点。如果当前读入的结点是虚结点,则不需要创建对应的结点,直接跳过。 2. 如果当前读入的结点是实结点,则创建一个新的二叉树结点,将其值设置为当前读入的值。 3. 判断当前结点的父节点是否存在,如果存在,则将当前结点作为父节点的左子节点或右子节点,具体是左子节点还是右子节点取决于先序序列中下一个结点的类型。 4. 将当前结点加入到一个栈中保存,以便后续处理。 5. 如果下一个结点是虚结点,则直接跳过;如果是实结点,则重复步骤2-4,直到先序序列结束。 6. 返回根节点。 下面是一个示例代码,用于根据带虚结点的先序序列创建二叉树: ```c++ #include <iostream> #include <stack> using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; TreeNode* createTree(vector<int>& preorder) { stack<TreeNode*> st; TreeNode* root = new TreeNode(preorder[0]); st.push(root); for (int i = 1; i < preorder.size(); i++) { if (preorder[i] == -1) { continue; } TreeNode* curr = new TreeNode(preorder[i]); if (i % 2 == 1) { st.top()->left = curr; } else { st.top()->right = curr; } st.push(curr); while (!st.empty() && st.top()->right != NULL) { st.pop(); } } return root; } int main() { vector<int> preorder = {1, 2, -1, 3, 4, 5, -1, -1, -1, -1, -1}; TreeNode* root = createTree(preorder); return 0; } ``` 在这个示例代码中,我们使用了一个栈来保存当前处理到的结点,以及其祖先结点。对于每个读入的结点,我们先判断其类型(虚结点还是实结点),然后根据其在先序序列中的位置,将其作为左子节点或右子节点加入到其父节点中。如果当前结点的右子节点已经存在,说明其已经处理完毕,我们可以将其从栈中弹出。最后,我们返回根节点即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值