順序棧(括號配對問題)c語言


/*一個表達式中包含兩種括號,( ) [ ] ,且這兩種括號可以按照任意次序嵌套使用。判別括號是否正確配對出現。
(1)掃描表達式,

(2)如果是左括號則入棧,繼續掃描

(3)如果是右括號則 彈出棧頂括號 與當前右括號判斷是否匹配;若匹配則繼續掃描,否則返回匹配不正確,不再掃描;

(4)掃描完成后若棧為空則正確配對,否則不正確。

【樣例輸入1】 9+(7-3)*[9/(8-5)]#

【樣例輸出1】 ok

【樣例輸入2】 )9+(7-3)*[9/(8-5)]#

【樣例輸出2】 error

【樣例說明】表達式內的數據項可都定義為字符型,表達式以#代表結束,
*/

 

#include<iostream>
#include<cstdlib>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define OVERFLOW -1
#define ERROR 0
#define TRUE 1
using namespace std;

typedef char SelemType;
typedef int status;
typedef struct{
SelemType *base; //基址
SelemType *top; //棧頂
int stacksize; //已分配空間的數據長度
}SqStack;

int InitStack(SqStack &s) //初始化順序棧
{ s.base=(SelemType *)malloc(STACK_INIT_SIZE * sizeof(SelemType));
if(!s. base) return(OVERFLOW);
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
return OK;
}

int Push(SqStack &S,SelemType e) //入棧
{
if(S.top-S.base>=S.stacksize) //判斷棧滿,若滿則追加存儲空間
{
S.base=(SelemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SelemType));
if(!S.base)
exit(OVERFLOW);
S.top=S.base+S.stacksize;// S.top指向新的S.base+S.stacksize(也有可能S.base沒變)
S.stacksize+=STACKINCREMENT;
}
*S.top++=e; //先賦值然后位置再加一
return OK;
}

int Pop(SqStack &s,SelemType &e) //出棧
{
if(s.top==s.base)return ERROR; //判斷是否為空棧
e=*(--s.top);
return OK;
}
int StackEmpty(SqStack s) //判棧空
{
if(s.base==s.top)return(TRUE);
else return(false);
}
void Match(SqStack &s)//判斷匹配
{
SelemType x,e;
int flag=true;//記錄匹不匹配
//cout<<"please input the char of the stack:";
cin>>x;
while(x!='#'&&flag==true)
{
if(x=='('||x=='[') Push(s,x);//判斷入棧
else if(x==')'||x==']')
{if(StackEmpty(s))flag=false;//判斷棧空
else {Pop(s,e);if((e=='('&&x==']')||(e=='['&&x==')'))flag=false;}//判斷括號匹不匹配
}
cin>>x;
}
if(flag==true&&StackEmpty(s))cout<<"ok";
else cout<<"error";
}

int main()
{
SqStack s;
InitStack(s);
Match(s);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM