一、实验内容
二、算法实现
1、用栈的特性实现进转换的思路:参考手算求进制转换的思路——除r取余法,这里的r表示基数,8进制的基数就是8,那么将十进制数转换成8进制数手算的方法就是除8取余法,具体手算方法如图:
从以上手算模拟过程我们得到启发,将每次所得余数进栈,最后再全部出栈所得到的输出序列就是进制转换的结果
2、用栈的特性判断一个字符串是否是回文串,我们可以扫描该字符串,并将字符串中的字符依次入栈,那么栈中数据域存放的就是该字符串的逆转字符串,此时只需使用简单的字符串比较函数strcmp判断当前字符串与栈中的字符串是否相等就可以判断该字符串是否是回文串了
1、栈的定义
//顺序栈的定义和实现
typedef struct SqStack {
ElemType data[MAXSIZE];
ElemType top; //栈顶指针
}SqStack;
2、栈的初始化操作实现
//初始化栈
void InitStack(SqStack& s)
{
s.top = -1; //当栈顶指针为-1时表示栈空
}
3、栈的判满和判空操作
//栈的判空操作
bool StackEmpty(SqStack s)
{
return s.top == -1;
}
//栈的判满操作
bool StackOverFlow(SqStack s)
{
return s.top == MAXSIZE - 1;
}
4、入栈操作
//进栈操作
bool Push(SqStack& s, ElemType e)
{
//入栈判满
if (StackOverFlow(s)) { return false; }
s.data[++s.top] = e;
return true;
}
5、出栈操作
//出栈操作
bool Pop(SqStack& s, ElemType& e)
{
//出栈判空
if (StackEmpty(s)) { return false; }
e = s.data[s.top--];
return true;
}
6、进制转换算法实现
//用栈实现进制转换
void Convert(SqStack &s, int x)
{
int base,temp;
printf("转换成几进制:?\n");
scanf("%d", &base);
//进制转换
while (x != 0)
{
temp = x % base;
Push(s, temp);
x = x / base;
}
}
5、回文串判断算法实现
//利用栈的特性判断一个字符串是否是回文串
void isEqualReverse(SqStack &s, char* str)
{
int i;
for (i = 0; str[i] != '\0'; i++)
{
Push(s, str[i]);
}
Push(s, str[i]);
if (strcmp(s.data, str) == 0)
{
printf("Right!\n");
}
else
{
printf("Wrong!\n");
}
}
6、完整源代码
//栈的定义和实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ElemType int
//定义顺序栈的最大容量
#define MAXSIZE 100
//顺序栈的定义和实现
typedef struct SqStack {
ElemType data[MAXSIZE];
ElemType top; //栈顶指针
}SqStack;
//初始化栈
void InitStack(SqStack& s)
{
s.top = -1; //当栈顶指针为-1时表示栈空
}
//栈的判空操作
bool StackEmpty(SqStack s)
{
return s.top == -1;
}
//栈的判满操作
bool StackOverFlow(SqStack s)
{
return s.top == MAXSIZE - 1;
}
//进栈操作
bool Push(SqStack& s, ElemType e)
{
//入栈判满
if (StackOverFlow(s)) { return false; }
s.data[++s.top] = e;
return true;
}
//出栈操作
bool Pop(SqStack& s, ElemType& e)
{
//出栈判空
if (StackEmpty(s)) { return false; }
e = s.data[s.top--];
return true;
}
//用栈实现进制转换
void Convert(SqStack &s, int x)
{
int base,temp;
printf("转换成几进制:?\n");
scanf("%d", &base);
//进制转换
while (x != 0)
{
temp = x % base;
Push(s, temp);
x = x / base;
}
}
//
利用栈的特性判断一个字符串是否是回文串
//void isEqualReverse(SqStack &s, char* str)
//{
// int i;
// for (i = 0; str[i] != '\0'; i++)
// {
// Push(s, str[i]);
// }
// Push(s, str[i]);
//
// if (strcmp(s.data, str) == 0)
// {
// printf("Right!\n");
// }
// else
// {
// printf("Wrong!\n");
// }
//}
int main()
{
SqStack s;
//初始化栈
InitStack(s);
int x, e; //x表示要进行进制转换的数,t用于获取栈顶元素
printf("请输入你需要进行转换的数字:\n");
scanf("%d", &x);
Convert(s, x);
//输出转换后的结果
printf("转换结果:\n");
while (s.top != -1)
{
Pop(s, e);
printf("%d", e);
}
判断一个字符串是否是回文串
//char str[MAXSIZE];
//printf("请输入你所需要进行判断的字符串:\n");
//scanf("%s", str);
//isEqualReverse(s, str);
return 0;
}
7、实验结果
进制转换:
回文串判断