试用C语言设计一个程序,程序的功能是接收任意输入一个算术表达式,判断表达式中的括号是否配对出现。

2024-11-24 05:49:15
推荐回答(4个)
回答1:

//最近的栈作业~
#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;
}

回答2:

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;
}

回答3:

算法如下(直接抄书):
做一个空栈。读入字符直至文件尾。如果字符是一个开放符号(左括号),则将其压入栈中。如果字符是一个封闭符号(右括号),那么若栈为空,则报错;栈不为空,则将栈元素弹出。如果弹出的符号表示对应的左括号,则报错。读完最后一个字符,如果栈非空则报错。
参考代码:
http://blog.csdn.net/cdl2008sky/article/details/8300249
你可以直接百度 平衡符号检测 C语言

回答4:

#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()); 


//占时只能做成这样了,你看看吧,明天我再看看能不能在满足你的别的要求!!