实验目的:
熟悉掌握数据结构中队列的基本操作,能够结合栈与队列的结构灵活解决一些实际中问题。
实验内容:
备注:1,2 任选一题
1.用栈的操作实现10进制数和d进制数的转换,并输出结果
2.括号配对的检测: 利用栈来解决括号配对问题,左括号配右括号, 如: ( ) 配对正确 ( ] 配对错误 ( [ ] ) 配对正确 ( [ ) ) 配对错误。
3.在许多语言现象中,常见到一种形如abcba的文字,这种文字从左到右读和从右到左读结果是一样的,这种文字就是常说的回文。设计一个程序可以判断给定的一个文字串是否是回文。
注意:在本实验中,要求在实现上面的题目时,必须使用如下算法: 考虑到栈的先进后出以及队列的先进先出,可以结合这两种结构来实现需要的功能,即将文字串分别入队和入栈,然后依次通过出队和出栈输出判断是否有不相同的字符,一旦发现就证明文字不是一个回文。
实验步骤:
第一步:编写程序,实现栈,该栈可以用数组实现,也可以用链表实现
第二步:编写程序,实现队列,该队列可为循环队列,也可以用链表实现
第三步:编写主算法,使用自己编写的栈和队列实现回文判断问题(通过键盘输入一个以#结束的字符串,进行判断)
进制转换问题:
第1题测试结果:
第1题代码实现:
由于实验四那里也有这个题的低级版本,所以这里借用实验四当时实现的栈来完成本小题。
void conversion()
{
int num, x;
cout << "请输入要转化的十进制数字:" << endl;
cin >> num;
cout << "期望将它转化为几进制数:" << endl;
cin >> x;
cout << "将十进制数 " << num << " " << "转化为 " << x << " " << "进制数得到的结果为:" << endl;
ST st;
InitStack(st);
while (num > 0)
{
Push(st, num % x);
num /= x;
}
while (!EmptyStack(st))
{
cout << GetTop(st);
PopTop(st);
}
DestroyStack(st);
}
int main()
{
conversion();
return 0;
}
括号匹配问题:
第2题测试结果:
第2题代码实现:
下面代码用c++写便捷一点;纯c解题思路完全一样;即直接使用C++自带stack和string。
#include<iostream>
#include<stack>
#include<string>
using namespace std;
bool Match(string str)
{
stack<char> s;
int count = 0;//计数,处理部分特殊情况,如1.只有一个括号,如2.第一个或最后一个为右括号
for (int i = 0; i < str.size(); i++)
{
if (str[i] == '{' || str[i] == '[' || str[i] == '<' || str[i] == '(')
{
s.push(str[i]);
count++;
}
if (str[i] == ')' && !s.empty())
{
count++;
if (s.top() == '(')
s.pop();
else
return false;
}
if (str[i] == '>' && !s.empty())
{
count++;
if (s.top() == '<')
s.pop();
else
return false;
}
if (str[i] == ']' && !s.empty())
{
count++;
if (s.top() == '[')
s.pop();
else
return false;
}
if (str[i] == '}' && !s.empty())
{
count++;
if (s.top() == '{')
s.pop();
else
return false;
}
}
if (count != str.size())
return false;
return s.empty();
}
int main()
{
string str1("><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]");
string str2("{{}}{{}}<<>><<>>(())(())[[]][[]]");
string str3("}");
string str4("}[]()");
string str5("}}}[]()");
string str6("[][]))");
cout << Match(str1) << endl;
cout << Match(str2) << endl;
cout << Match(str3) << endl;
cout << Match(str4) << endl;
cout << Match(str5) << endl;
cout << Match(str6) << endl;
return 0;
}
回文字符串问题:(栈)
第3题(实验自带做法,纯C)
这里的代码是比较老旧的写法了,下面是实验里面提供的一个栈,合理里利用这个栈来达到了第3小题的判断回文字符串的目的,第3小题在这里的它提供的做法目的就仅仅是锻炼使用栈的能力而已。
#include"stdlib.h"
#include"stdio.h"
#define STACK_INCREAMENT 10 //宏定义,堆栈增量;无分号 #define STACK_INI_SIZE 100 //宏定义,堆栈初始空间大小
typedef char ElemType; //堆栈元素类型为char
typedef struct{
ElemType *base; ElemType *top; int stacksize;
}sqstack;//结构体,顺序结构存储的栈的首尾指针
typedef struct QNode{
char data;
struct QNode *next;
}QNode,*Queueptr; //结构体,链式结构的队列
typedef struct{
Queueptr front;
Queueptr rear;
}linkQueue; //结构体,用于存放队列的首尾指针
void initStack(sqstack &s){
s.base=(ElemType*)malloc(STACK_INI_SIZE*sizeof(ElemType)); if(!s.base)
exit(0);
s.top=s.base;
s.stacksize=STACK_INI_SIZE;
}//初始化空栈
void initLinkQueue(linkQueue &q){
q.front=(Queueptr)malloc(sizeof(QNode));
if(!q.front)
exit(0);
q.rear=q.front;
}//初始化空队列
void push(sqstack &s,ElemType e){
if(s.top-s.base>=s.stacksize)
{
ElemType *newbase; newbase=(ElemType*)realloc(s.base,(STACK_INI_SIZE+STACK_INCREAMENT)*sizeof(ElemType));
if(!newbase)
exit(0);
s.base=newbase;
s.top=s.base+s.stacksize;
s.stacksize=STACK_INI_SIZE+STACK_INCREAMENT;
}//追加空间
*s.top=e;
s.top++;
}//元素入栈操作
void pop(sqstack &s,ElemType &e){
if(s.base==s.top)
return; //栈空,退出
s.top--;
e=*s.top;
}//元素出栈,并用e返回其值
void EnQueue(linkQueue &q,char c){
Queueptr pre=q.rear;
q.rear=(Queueptr)malloc(sizeof(QNode));
q.rear->data=c;
q.rear->next=NULL;
pre->next=q.rear;
}//元素入队列操作
void DeQueue(linkQueue &q,char &e){
Queueptr temp=q.front;
e=temp->data;
q.front=q.front->next;
free(temp);
}//元素出队列操作,并用e返回其结点数据域
int main(){
sqstack s;//定义堆栈结构体,用于存放堆栈首尾指针
linkQueue lQueue;//定义结构体,用于存放队列首尾指针
char c;
initStack(s);//初始化一个空的堆栈
initLinkQueue(lQueue);//初始化一个空的队列
printf("请输入一串字符,并以#结束:\n");
scanf("%c",&c);
while(c!='#') {
push(s, c); //字符入栈
EnQueue(lQueue, c);//字符入队列
scanf("%c",&c);
}//分别向堆栈与队列中存入该字符串
lQueue.front=lQueue.front->next;
while(!(s.top==s.base)){
char a,b;
pop(s,a); //字符出栈
DeQueue(lQueue,b); //字符出队列
if(a!=b) {
printf("该字符串不是回文字\n"); //不是回文字
exit(0);
}//两字符进行比较
}//将堆栈与队列中的元素出栈,并进行比较,判断该字符串是否为回文字
printf("该字符串是回文字\n"); //输出判断结果,是回文字
return 0;
}//主程序,完成回文字符串的判定,并输出判定结果