《数据结构》实验报告
实验序号:4 实验项目名称:栈的操作
}
改写以上程序,实现功能如下:
调用栈操作函数实现判别一个算术表达式中的圆括号和方括号配对是否正确匹配。
2.C/C++的库函数中已经实现了栈,实例如下:
#include<stack> //引入栈
using namespace std;
int main()
{
int a;
stack<int>s;
scanf("%d",&a);
s.push(a); //入栈
printf("%d\n",s.top()); //取得栈顶元素输出
s.pop(); //出栈
return 0;
}
请根据以上程序,设计算法如下:
判别一个算术表达式中的圆括号配对是否正确。
四、分析与讨论
1.
2.
对上机实践结果进行分析,上机的心得体会。
五、教师评语
成绩
签名:
日期:
附源程序清单:
1.
#include <iostream>
#define MaxSize 100
using namespace std;
typedef char ElemType;
typedef struct
{
ElemType data[MaxSize];
int top;
}SqStack;
void InitStack(SqStack *st) //初始化栈
{
st->top=-1;
}
int StackEmpty(SqStack *st) //判断栈为空
{
return (st->top==-1);
}
void Push(SqStack *st,ElemType x) //元素进栈
{
if(st->top==MaxSize-1)
{
printf("栈上溢出!\n");
}
else
{
st->top++; //移动栈顶位置
st->data[st->top]=x; //元素进栈
}
}
void Pop(SqStack *st,ElemType *e) //出栈
{
if(st->top==-1)
{
printf("栈下溢出\n");
}
else
{
*e=st->data[st->top]; //元素出栈
st->top--; //移动栈顶位置
}
}
int main()
{
SqStack L;
SqStack *st=&L;
ElemType e,a[MaxSize];
int i,j=1,k;
do{
InitStack(st);
gets(a);
for(i=0;a[i]!='\0';i++)
{
if(a[i]=='('||a[i]=='{'||a[i]=='[') //左括号入栈Push(st,a[i]);
if(a[i]==')')
{
if(StackEmpty(st) ==1)//判断栈是否为空
{
printf("多了“(”,不匹配\n");
break;
}
else
if('('==st->data [st->top ])//匹配成功出栈
Pop(st,&e);
else
{
printf("%c不匹配\n",a[i]);
break;
}
}
if(a[i]=='}')
{
if(StackEmpty(st) ==1)//判断栈是否为空
{
printf("多了“}”,不匹配\n");
break;
}
else
if('{'==st->data [st->top ])//匹配成功出栈
Pop(st,&e);
else
{
printf("%c不匹配\n",a[i]);
break;
}
}
if(a[i]==']')
{
if(StackEmpty(st) ==1) //判断栈是否为空
{
printf("多了“]”,不匹配\n");
break;
}
else
if('['==st->data [st->top ])//匹配成功出栈
Pop(st,&e);
else
{
printf("%c不匹配\n",a[i]);
break;
}
}
}
if(st->top ==-1)
printf("匹配成功\n");
else
printf("匹配不成功,多了%c。
\n",st->data [st->top ]);
printf("是否继续匹配括号:(继续不要按“#”)\n");
scanf("%c",&e);
k=getchar();//这是为了输入e时会敲回车键而加上去的
}while(e!='#');
}
2.(1)
#include<stack> //引入栈
using namespace std;
int main()
{
int a,i;
char b[50];
stack<char>s;//声明了一个char型的栈,括号里面的可以改为任何基本类型
gets(b);
for(i=0;b[i]!='\0';i++)
{
if(b[i]=='('||b[i]=='[')
{
s.push(b[i]);
}//如果为"("或者是"[",就入栈
if(b[i]==')')
{
if(s.empty()==1 )//s.empty是判断函数,若无栈顶元素就会返回1,表明栈为空,否则就会返回0
{
printf("不匹配\n");
break;
}
if(s.top()=='(')//判断是否符合出栈的条件
{
s.pop() ;//匹配就会出栈
}
else
{
printf("不匹配\n");
break;
}
}
if(b[i]==']')
{
if(s.empty() ==1) //判断栈是否为空
{
printf("不匹配\n");
break;
}
if(s.top()=='[')
{
s.pop() ;
}
else
{
printf("不匹配\n");
break;
}
}
}
if(s.empty()==1&&b[i]=='\0') //调用函数,判断栈是否已经为空或者数组的右括号已经匹配完成
printf("匹配成功\n");
if(s.empty()==0)//b[i]已经比较完了,但是若是栈里元素没有出栈,就不能说是匹配完全
printf("匹配不成功\n");
return 0;
}
(2)
#include "iostream"
#include<stack> //引入栈
using namespace std;
int main()
{
int a;
stack<char>s;//申请一个char型的栈
printf("输入回车键结束入栈\n");
while((a=getchar())!='\n')//一个一个的读入并匹配,若不匹配就跳出{
switch(a) //swith 是一种条件语句
{
case'[':
case'(':
s.push(a);
continue;//[或(就进栈
case')':
case']':
if(s.empty()==0)
{
s.pop();
continue;
}
else
{
printf("右括号多出,配对失败。
\n");
goto loop;
}
}
}
if(s.empty()==0)
printf("左括号多出,配对失败。
\n");
else
printf("配对成功!\n");
loop:
return 0;
}。