亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

括號的匹配

我沒搞懂,如果有這么個字符串[([(]])),該棧要怎么實現判斷,求解決

正在回答

4 回答

老師講的用兩個棧的沒有聽懂,自己想了一個辦法,望采納

Mystack<char>*pmystack=new Mystack<char>(50);

char str[]="[{()({{}}())}](([{}])){[([])]}{}()";

pmystack->Push(str[0]);//讓第一個字符入棧

for(int i=1;i<strlen(str);i++)//從第二個字符開始掃描

{

if((pmystack->m_pBuffer[pmystack->m_iTop-1]=='('&&str[i]==')')||(pmystack->m_pBuffer[pmystack->m_iTop-1]=='['&&str[i]==']')||(pmystack->m_pBuffer[pmystack->m_iTop-1]=='{'&&str[i]=='}'))//如果當前掃描的字符與棧頂的前一個字符相匹配,則出棧

{

pmystack->Pop();

}

else//如果不符合就入棧

{

pmystack->Push(str[i]);

}

}

if(pmystack->stackEmpty())//如果掃面玩所有的字符棧為空,則說明全部匹配完畢

cout<<"該字符串為匹配的括號"<<endl;

else

cout<<"該字符串為不匹配的括號"<<endl;

delete pmystack;

pmystack=NULL;


2 回復 有任何疑惑可以回復我~
#1

墓男神 提問者

非常感謝!
2016-08-04 回復 有任何疑惑可以回復我~
#2

慕粉3631940

厲害 !
2016-10-13 回復 有任何疑惑可以回復我~
#3

菠蘿1230

不過你這是把棧類屬性全改為public了么?
2017-02-19 回復 有任何疑惑可以回復我~

#include<iostream>

using namespace std;

#include<string.h>

class Stack{

private:

? ? ? char *p;

? ? ? int top;

? ? ? int maxsize;

public:

? ? ? Stack(int size)

? ? ? {

? ? ? ? ? ? top=-1;

? ? ? ? ? ? maxsize=size;

? ? ? ? ? ? p=new char[size];

? ? ? }

? ? ? bool IsEmpty(){return ?(top==-1)?true:false;}

? ? ? bool ?IsFull(){return (top==maxsize-1)?true:false;}

? ? ? bool Push(char &x)

? ? ? {

? ? ? if(IsFull())

? ? ? ? ? ? return false;

? ? ? ? ? ? p[++top]=x;

? ? ? return true;

? ? ? }

? ? ? bool ?Pop(char &x)

? ? ? {

? ? ? ? ? ? if(IsEmpty())

? ? ? ? ? ? return ?false;

? ? ? x=p[top--];

? ? ? }


};


int main()

{

? ? ? Stack *p=new Stack(50);

? ? ? int flag=0;

? ? ? char elem;

? ? ? char str[51];

? ? ? cin>>str;

? ? ? for(int i=0;i<strlen(str);i++)

? ? ? {

? ? ? ? ? ? switch(str[i])

? ? ? ? ? ? {

? ? ? ? ? ? case'(':

? ? ? ? ? ? case'{':

? ? ? ? ? ? case'[':

? ? ? ? ? ? ? ? ? p->Push(str[i]);

? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? case')':

? ? ? ? ? ? ? ? ? if(p->Pop(elem)==0)

? ? ? ? ? ? ? ? ? ? ? ? flag=1;

? ? ? ? ? ? ? ? ? if(elem!='(')

? ? ? ? ? ? ? ? ? ? ? ? flag=1;

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? case'}':

? ? ? ? ? ? ? ? ? ?if(p->Pop(elem)==0)

? ? ? ? ? ? ? ? ? ? ? ? flag=1;

? ? ? ? ? ? ? ? ? if(elem!='{')

? ? ? ? ? ? ? ? ? ? ? ? flag=1;

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ?case']':

? ? ? ? ? ? ? ? ? ?if(p->Pop(elem)==0)

? ? ? ? ? ? ? ? ? ? ?flag=1;

? ? ? ? ? ? ? ? ? if(elem!='[')

? ? ? ? ? ? ? ? ? ?flag=1;

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? }

? ? ? ?if(p->IsEmpty()==0||flag==1)

? ? ? ? ? ? ? ? ? cout<<"false"<<endl;

? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? cout<<"true"<<endl;

? ? ? return 0;


}


1 回復 有任何疑惑可以回復我~
#1

qq__cnszBQ

請問這是用的 順序存儲結構 嗎
2018-11-10 回復 有任何疑惑可以回復我~

//一個棧實現

#include <iostream>
#include "stack.h"

using namespace std;

int main(int argc, char *argv[])
{
? ?char p[] = "[[]()[]]]";
? ?MyStack<char> sch(10);
? ?char *temp = p;
? ?char ch1 = 0,ch2 = 0;
? ?while(*temp)
? ?{
? ? ? ?ch1 = *temp;
? ? ? ?if(!sch.stackEmpty())
? ? ? ?{
? ? ? ? ? ?sch.pop(ch2);//取出棧頂元素
? ? ? ? ? ?if((ch2 == '(' && ch1 == ')') || (ch2 == '[' && ch1 == ']')
? ? ? ? ? ? ? ? ? ?|| ch2 == '{' && ch1 == '}')
? ? ? ? ? ?{//如果取出的括號,與下一個括號匹配,則丟棄取出的括號
? ? ? ? ? ? ? ?temp++;
? ? ? ? ? ? ? ?continue;
? ? ? ? ? ?}
? ? ? ? ? ?sch.push(ch2);//如果不匹配,則放回棧里
? ? ? ?}
? ? ? ?sch.push(ch1);
? ? ? ?temp++;
? ?}
? ?if(sch.stackEmpty())
? ? ? ?cout << "括號匹配" << endl;
? ?else
? ? ? ?cout << "括號不匹配" << endl;

? ?return 0;
}

1 回復 有任何疑惑可以回復我~

字符串[([(]]))這種情況可以在判斷是否匹配時遍歷之前存起來的需要匹配的括號,如果有匹配則剔除,但這種明顯不適用與該棧這種機制了

1 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
數據結構探險—棧篇
  • 參與學習       62770    人
  • 解答問題       105    個

棧,先入后出(FILO),帶領大家體會棧這種數據結構的美妙

進入課程

括號的匹配

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號