花括号电脑初始化后会怎么样,数据是分配到堆上还是栈上了

假设一个算术表达式中包含圆括号()、方括号[]和花括号{}三类括号,要求判断表达式中括号是否正确匹配配对。
分析:括号匹配符号后到的括号要最先被匹配,所以满足栈“后进先出”的特点。
括号匹配共有四种情况:(1)左右括号配对次序不正确,即存在类似“(]”这种情况;(2)右括号多于左括号;(3)左括号多于右括号;(4)匹配正确。
综上:我们可以存储表达式的字符串并按顺序扫描,进行匹配。顺序栈和链式堆栈都可以;
下面看代码:(不再构造栈类,上篇有)
package StackAndQ
* @author sun
* 创建时间:日下午2:52:31
public class BraceMatch {
//遍历字符数组并利用进栈出栈匹配括号
static void expIsCorrect(String[] exp,int n)throws Exception{
SeqStack myStack = new SeqStack();
//LinStack myStack = new LinStack(); //也可以用链式堆栈
for(int i=0;i&n;i++){//如果是左括号就入栈
if((exp[i].equals(new String("(")))
|| (exp[i].equals(new String("[")))
|| (exp[i].equals(new String("{"))))
myStack.push(exp[i]);
//如果是右括号)并且和栈顶(匹配,出栈
else if((exp[i].equals(new String(")"))) && myStack.notEmpty()
&& myStack.getTop().equals(new String("(")))
myStack.pop();
//遍历的右括号)和栈顶不匹配,说明公式错误,结束遍历
else if((exp[i].equals(new String(")"))) && myStack.notEmpty()
&& !myStack.getTop().equals(new String("("))){
System.out.println("左右括号匹配次序不正确!");
//如果是右括号]并且和栈顶[匹配,出栈
else if((exp[i].equals(new String("]"))) && myStack.notEmpty()
&& myStack.getTop().equals(new String("[")))
myStack.pop();
//遍历的右括号]和栈顶不匹配,说明公式错误,结束遍历
else if((exp[i].equals(new String("]"))) && myStack.notEmpty()
&& !myStack.getTop().equals(new String("["))){
System.out.println("左右括号匹配次序不正确!");
//如果是右括号}并且和栈顶{匹配,出栈
else if((exp[i].equals(new String("}"))) && myStack.notEmpty()
&& myStack.getTop().equals(new String("{")))
myStack.pop();
//遍历的右括号}和栈顶不匹配,说明公式错误,结束遍历
else if((exp[i].equals(new String("}"))) && myStack.notEmpty()
&& !myStack.getTop().equals(new String("{"))){
System.out.println("左右括号匹配次序不正确!");
//如果栈已空,但还存在右括号,说明右括号多了
else if((exp[i].equals(new String(")")))
|| (exp[i].equals(new String("]")))
|| (exp[i].equals(new String("}")))
&& !myStack.notEmpty()){
System.out.println("右括号多余左括号!");
//遍历完成后栈内还有元素,说明左括号多了
if(myStack.notEmpty())
System.out.println("左括号多余右括号!");
System.out.println("括号匹配正确!");
private static String[] strToString(String str){//把字符串转换为String类型数组
//为什么不转换为字符数组char[]呢?
//因为只有String类型的数据才具有可比性,也就是能用equals
int n = str.length();
String[] a = new String[n];
for(int i=0;i&n;i++){
a[i] = str.substring(i,i+1);//取子串含头不含尾,故可以取出i位置的字符并返回字符串类型
public static void main(String[] args) {
str = "(())abc{[}(){";//左右括号匹配次序不正确
n = str.length();
String[] a = strToString(str);
expIsCorrect(a,n);
str = "(()))abc{[]}";//右括号多余左括号
n = str.length();
String[] b = strToString(str);
expIsCorrect(b,n);
str = "(()()abc{[]}";//左括号多余右括号
n = str.length();
String[] c = strToString(str);
expIsCorrect(c,n);
str = "(())abc{[]}";//括号匹配正确!
n = str.length();
String[] d = strToString(str);
expIsCorrect(d,n);
catch(Exception e){
System.out.println(e.getMessage());
左右括号匹配次序不正确!
右括号多余左括号!
左括号多余右括号!
括号匹配正确!
括号匹配问题,用栈实现
【面试题】用栈解决括号匹配问题
栈用于解决括号匹配问题
关于括号匹配问题
没有更多推荐了, 上传我的文档
 上传文档
 下载
 收藏
粉丝量:171
该文档贡献者很忙,什么也没留下。
 下载此文档
【最新编排】数据结构C语言版 栈实现括号匹配的检验
下载积分:200
内容提示:【最新编排】数据结构C语言版 栈实现括号匹配的检验
文档格式:PDF|
浏览次数:303|
上传日期: 17:53:36|
文档星级:
全文阅读已结束,如果下载本文需要使用
 200 积分
下载此文档
该用户还上传了这些文档
【最新编排】数据结构C语言版 栈实现括号匹配的检验
关注微信公众号&&&& 输入一个括号字符串,依次检验,若为左括号则则入栈,若为右括号则出栈一个字符判断是否与之相对应,在最后还需判断栈是否为空,如果不为空则不匹配。
首先回顾栈的基本知识:
&&& 定义栈的结构体并初始化一个新栈:
struct stack
char strstack[stacksize];
void InitStack(stack &s)
&&&& 出栈和入栈操作:
char Push(stack &s,char a)
if(s.top==stacksize-1)
s.strstack[s.top]=a;
char Pop(stack &s)
if(s.top==-1)
char a=s.strstack[s.top];
&& 判断栈是否为空:
int Empty(stack &s,int re)
if(s.top==-1)
以上是栈的基本操作,定义一个栈和初始化一个新栈,出栈和入栈操作,以及判断栈是否为空的情况。接下来将写一个函数,检查字符串的每个字符,左括号则进行入栈操作,右括号则进行出栈操作看其是否匹配,最后判断是否为空以判定是否匹配。代码如下:
int Check(char *str)
InitStack(s);
int strn=strlen(str);
for(int i=0;i&i++)
char a=str[i];
switch (a)
Push(s,a);
if(Pop(s)!='(')
if(Pop(s)!='[')
if(Pop(s)!='{')
re=Empty(s,re);
&& 自此,括号字符串匹配的判断问题已经解决,下面贴出完整的经过编译运行过的代码。
#include &iostream&
#include &stdio.h&
#include &string.h&
using namespace
#define stacksize 100
struct stack
char strstack[stacksize];
void InitStack(stack &s)
char Push(stack &s,char a)
if(s.top==stacksize-1)
s.strstack[s.top]=a;
char Pop(stack &s)
if(s.top==-1)
char a=s.strstack[s.top];
int Empty(stack &s,int re)
if(s.top==-1)
int Check(char *str)
InitStack(s);
int strn=strlen(str);
for(int i=0;i&i++)
char a=str[i];
switch (a)
Push(s,a);
if(Pop(s)!='(')
if(Pop(s)!='[')
if(Pop(s)!='{')
re=Empty(s,re);
void main()
char str[100];
cout&&"请输入一个长度小于100的字符串:"&&
int re=Check(str);
cout&&"你输入的字符串括号完全匹配!"&&
else if(re==0)
cout&&"你输入的字符串括号不匹配!"&&
阅读(...) 评论()21:31 提问
符号匹配(50分)
题目内容:
判断输入的括号字符串是否匹配,
括号有()、[]、{}、&&四种,
匹配的定义如下:
(1) 空字符串为匹配。
(2) 若S为匹配字符串,则(S)、[S]、{S}、为匹配自串。
(3) 两个匹配字符串串接亦为匹配字符串。
输入第一行为一个数字T,代表测试数据的笔数。
接下来会有T笔测试数据,每一笔测试数据一行。
每一笔测试数据的字符串长度不超过2000字符。
输出格式:
输出一行数字,输出测资中有多少匹配字符串。
输入样例:
输出样例:
按赞数排序
麻烦楼主采纳一下,谢谢^^
/*** Seqstack.h **/
#pragma once
#define MAXSIZE 1024
#include &stdlib.h&
#include &stdio.h&
#include &string.h&
struct SStack
void* data[MAXSIZE]; //保存数据的数组
typedef void* SeqS
#ifdef __cplusplus
extern "C"{
SeqStack Init_SeqStack();
void Push_SeqStack(SeqStack stack,void *data);
void Pop_SeqStack(SeqStack stack);
//获得栈顶元素
void* Top_SeqStack(SeqStack stack);
//获得栈中元素个数
int Size_SeqStack(SeqStack stack);
void Destroy_SeqStack(SeqStack stack);
#ifdef __cplusplus
/***Seqstack.cpp**/
#include"SeqStack.h"
SeqStack Init_SeqStack()
//一般情况下,只要开辟内存空间都要初始化
struct SStack *stack = malloc(sizeof(struct SStack));
for (int i = 0; i & MAXSIZE;++i)
stack-&data[i] = NULL;
//memset(stack-&data, 0, MAXSIZE * sizeof(void *));
stack-&size = 0;
void Push_SeqStack(SeqStack stack, void *data)
if (NULL == stack)
if (NULL == data)
struct SStack *s = (struct SStack *)
if (s-&size == MAXSIZE)
s-&data[s-&size] =
s-&size++;
void Pop_SeqStack(SeqStack stack)
if (NULL == stack)
struct SStack *s = (struct SStack *)
if (s-&size == 0)
s-&size--;
//获得栈顶元素
void* Top_SeqStack(SeqStack stack)
if (NULL == stack)
return NULL;
struct SStack *s = (struct SStack *)
if (s-&size == 0)
return NULL;
return s-&data[s-&size - 1];
//获得栈中元素个数
int Size_SeqStack(SeqStack stack)
if (NULL == stack)
return -1;
struct SStack *s = (struct SStack *)
return s-&
void Destroy_SeqStack(SeqStack stack)
if (NULL == stack)
free(stack);
stack = NULL;
/****main.c*****/
#define _CRT_SECURE_NO_WARNINGS
#include&stdio.h&
#include&string.h&
#include&stdlib.h&
#include"SeqStack.h"
int IsLeft(char ch)
return ch == '(';
int IsRight(char ch)
return ch == ')';
void printError(const char *str, char *pos)
printf("%s\n",str);
int dis = pos -
for (int i = 0; i & ++i)
printf(" ");
printf("A\n");
void test()
const char *str = "5+5*(6)+9/3(*1)-(1)+3()";
char *p = (char *)
SeqStack stack = Init_SeqStack();
while (*p != '\0')
//如果是左括号,入栈
if (IsLeft(*p))
Push_SeqStack(stack, p);
//如果是右括号
if (IsRight(*p))
if (Size_SeqStack(stack) & 0)
Pop_SeqStack(stack);
//printf("没有匹配的左括号!\n");
printError(str, p);
//如果栈不为空,栈中剩下的是左括号
while (Size_SeqStack(stack) & 0)
//printf("左括号没有匹配的右括号!\n");
printError(str,
(char *)Top_SeqStack(stack) );
Pop_SeqStack(stack);
Destroy_SeqStack(stack);
int main(){
system("pause");
return EXIT_SUCCESS;
楼主你自己根据我写的函数类似写出另外几个括号就可以了
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐这题c语言用栈怎么做_百度知道
这题c语言用栈怎么做
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
回忆在上辈子
回忆在上辈子
采纳数:748
获赞数:981
是括号匹配啊栈是种先入后出的数据结构根据这种数组结构的特性可以在一系列入栈和出栈后检查栈是否为空达到括号匹配的目的如果自己不想写代码的话我可以有偿代劳
那如果出现(【)】怎么检查
出栈时对应括号做检查就可以了
是把所有的左括号右括号都压入栈?
只入左边就好
然后遇到匹配的右括号就出栈,那出栈入栈函数都是要自己写
数据结构要自己构造的
不过可以简单构造也不算太麻烦
采纳数:46
获赞数:127
这个容易啊,遍历每个字符,如果是左括号就压栈,如果是右括号就出栈,如果没找到左括号就直接false,直到最后站内如果有数据就是false,如果刚好没数据就true。
那还有(【)】这种情况
不同类型可以建不同的栈内存,也可以用一个栈内存,但是要加类型判断嘛。多少个括号都没关系啊,遇到相同类型的才判断出栈嘛。
是不是写的指针有问题
你这逻辑不够清晰,首先你的s分配了两次空间就不对,而且初始化那个函数里面分配空间写法就不对,要在调用函数里面分配空间,需要使用双指针形式。还有,输入数组str也没有全部置0,可能会导致strlen有误。还有,s是Stack指针,你每次使用都只在一个Stack空间上操作,根本没法区分哪种类型的括号。最后,你分配了空间,不释放,造成内存泄漏。我手机不好写代码,有空写一个给你吧。
c++是不是可以直接用stack
是有封装好的。但是你这题不是限定的吗?如果不限定,干嘛要用栈,直接计数不就行了?
没限定一点用c
问下,int数据可以直接等于long long型的变量吗
可以啊,C不是严格类型安全的。
那我在dev可以编译拿到oj就编译失败
强制转换一下啊。
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 手机网络初始化 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信