//最近的栈作业~
#include
using namespace std;
class Stack
{
private:
int maxSize;
int top;
int *p;
public:
Stack(int size)
{
maxSize=size;
top=-1;
p=new int[maxSize];
}
~Stack()
{
delete [] p;
}
void Clear() //清空栈
{
top=-1;
}
bool Push(const int value) //压入
{
if(top==maxSize-1)
{
cout<<"栈满溢出"<return false;
}
else
{
p[++top]=value;
return true;
}
}
bool Pop(int &value) //读取栈顶元素的值并删除
{
if(top==-1)
{
cout<<"栈为空,不能进行删除操作"<return false;
}
else
{
value=p[top--];
return true;
}
}
bool Top(int &value) //读取栈顶元素的值并不删除
{
if(top==-1)
{
cout<<"栈为空,不能读取栈顶元素"<return false;
}
else
{
value=p[top];
return true;
}
}
bool IsEmpty() //栈空否?
{
if(top==-1)
return true;
else
return false;
}
bool IsFull() //栈满否?
{
if(top==maxSize-1)
return true;
else
return false;
}
void show() //查看栈内元素的值
{
int t=top;
cout<<"栈内元素:"<while(t+1)
cout<cout<
}
};
void match()
{
int i=0,flag=1,temp,flag2=1;
char s[50];
char c;
Stack formula(10);
cout<<"输入一个式子:\n";
cin>>s;
c=s[i];
while(c&&flag)
{
if(c=='('||c=='['||c=='{')
{
formula.Push(c);
flag2=0;
}
else if(c==')'||c==']'||c=='}')
{
if(formula.IsEmpty())
{
flag=0;
break;
}
formula.Pop(temp);
if(temp==c-1||temp==c-2);
else
{
flag=0;
break;
}
}
c=s[++i];
}
if(!formula.IsEmpty())
flag=0;
if(flag2)
cout<<"无括号\n";
else if(flag)
cout<<"括号配对正确\n";
else
cout<<"括号配对错误\n";
}
int main()
{
match();
return 0;
}
char stack[1024];
int sptr=0;
int push(char ch){
stack[sptr++]=ch;
return sptr;
}
int pop(){
if(sptr>0){
return stack[--sptr];
}else{
return -1;
}
}
int isLeft(char c){
return c=='('||c=='[';
}
int isPair(char left,char right){
return ((left=='(')&&(right==')')) || ((left=='[')&&(right==']'));
}
int main(){
char tmp[1024];
int i;
scanf("%s",tmp);
for(i=0;tmp[i];i++){
if(isLeft(tmp[i])){
push(tmp[i]);
}else{
char c=pop();
if(c==-1){
printf("右括号多余");
return 0;
}
if(!isPair(c,tmp[i])){
printf("左右括号不匹配");
return 0;
}
}
}
if(sptr==0){
printf("匹配");
}else{
printf("左括号多余");
}
return 0;
}
算法如下(直接抄书):
做一个空栈。读入字符直至文件尾。如果字符是一个开放符号(左括号),则将其压入栈中。如果字符是一个封闭符号(右括号),那么若栈为空,则报错;栈不为空,则将栈元素弹出。如果弹出的符号表示对应的左括号,则报错。读完最后一个字符,如果栈非空则报错。
参考代码:
http://blog.csdn.net/cdl2008sky/article/details/8300249
你可以直接百度 平衡符号检测 C语言
#include
#include
typedef struct node{
char ch;
node *next;
}Linkstack;
Linkstack *Setstack(){ //创建空链栈
Linkstack *S;
S=(Linkstack *)malloc(sizeof(Linkstack));
S->next=NULL;
return S;
}
Linkstack *Pushstack(Linkstack *S,char c){ //入栈
Linkstack *p;
p=(Linkstack *)malloc(sizeof(Linkstack));
p->ch=c;
p->next=S->next;
S->next=p;
return S;
}
Linkstack *Popstack(Linkstack *S){ //出栈
Linkstack *p;
p=S->next;
S->next=p->next;
free(p);
return S;
}
char Gettop(Linkstack *S){ //取栈顶数据
if(S->next!=NULL)
return S->next->ch;
else
return ' ';
}
int Judgepair( ){ //判断圆括号是否正确配对
Linkstack *p;
char c;
int sign=1;
p=Setstack();
printf("请输入算术表达式,并以'#'结束!\n");
c=getchar();
while(c!='#'){
switch(c){
case'(': //扫描到'('入栈
p=Pushstack(p,c); break;
case')': //扫描到')',判断栈顶是否是'('
if(Gettop(p)=='(') //若栈顶是'(',则出栈
p=Popstack(p);
else //若栈顶不是'(',则配对错误
sign=0;
break;
}
if(sign==0)
break;
else
c=getchar();
}
if(p->next!=NULL) //最后查看栈中是否为空
sign=0;
return sign;
}
void Judgeout(int a){ //判断结果输出
if(a==1)
printf("算术表达式圆括号配对正确!\n");
if(a==0)
printf("算术表达式圆括号配对错误!\n");
}
void main(){
Judgeout(Judgepair());
}
//占时只能做成这样了,你看看吧,明天我再看看能不能在满足你的别的要求!!