課程
/后端開發
/C++
/數據結構探險—棧篇
我沒搞懂,如果有這么個字符串[([(]])),該棧要怎么實現判斷,求解決
2016-07-31
源自:數據結構探險—棧篇 4-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;
墓男神 提問者
慕粉3631940
菠蘿1230
#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!='(')
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case'}':
? ? ? ? ? ? ? ? ? ?if(p->Pop(elem)==0)
? ? ? ? ? ? ? ? ? if(elem!='{')
? ? ? ? ? ? ?case']':
? ? ? ? ? ? ? ? ? ? ?flag=1;
? ? ? ? ? ? ? ? ? if(elem!='[')
? ? ? ? ? ? ? ? ? ?flag=1;
? ? ? ? ? ? }
? ? ? ?if(p->IsEmpty()==0||flag==1)
? ? ? ? ? ? ? ? ? cout<<"false"<<endl;
? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? cout<<"true"<<endl;
? ? ? return 0;
qq__cnszBQ
//一個棧實現
#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;}
字符串[([(]]))這種情況可以在判斷是否匹配時遍歷之前存起來的需要匹配的括號,如果有匹配則剔除,但這種明顯不適用與該棧這種機制了
舉報
棧,先入后出(FILO),帶領大家體會棧這種數據結構的美妙
2 回答括號的匹配問題
2 回答括號[([)]]為不匹配
1 回答括號匹配有問題
2 回答自己寫的一個單棧括號匹配,支持干擾字符
1 回答()))不匹配
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2016-08-01
老師講的用兩個棧的沒有聽懂,自己想了一個辦法,望采納
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;
2018-05-22
#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;
}
2016-08-27
//一個棧實現
#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;
}
2016-08-01
字符串[([(]]))這種情況可以在判斷是否匹配時遍歷之前存起來的需要匹配的括號,如果有匹配則剔除,但這種明顯不適用與該棧這種機制了