Bootstrap

【数据结构】宜宾大学-计院-实验六

实验目的:

熟悉掌握数据结构中队列的基本操作,能够结合栈与队列的结构灵活解决一些实际中问题。

实验内容:

备注: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; 
}//主程序,完成回文字符串的判定,并输出判定结果

学习C++得看这

;