一、实验目的:
1.掌握堆栈、队列的存储方式和基本操作
2.掌握堆栈及队列运算原则在解决实际问题中的应用
二、实验内容:
1.利用栈结构,编写程序将十进制数转换成N进制数。
说明:十进制数值转换成二进制使用辗转相除法将一个十进制数值转换成二进制数值。即用该十进制数值除以2,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的二进制数值。十进制数值转换成八进制算法类似。转换算法要求用一个函数完成。
2.编程判断一个字符串是否为回文。
说明:要求使用堆栈和队列结构。
三、实验源代码
进制转换
#include<stdio.h>
#include<malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct{
int *base;
int *top;
int stacksize;
}SqStack;
int InitStack(SqStack *S) //初始化
{
S->base = (int *)malloc(sizeof(int));
if(!S->base)
return -1;
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return 0;
}
int Push(SqStack *S, int e) //入栈、插入元素e为新的栈顶元素
{
if(S->top-S->base >= S->stacksize) //栈满,则分配存储空间
{
S->base = (int *)realloc(S->base, (S->stacksize+STACKINCREMENT)*sizeof(int));
if(!S->base)
return -1;
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*(S->top) = e;
S->top++;
}
int Pop(SqStack *S, int *e) //出栈、若栈不空,则删除S的栈顶元素,用e返回其值
{
if(S->top == S->base)
return -1;
S->top--;
*e = *(S->top);
}
int conversion(int number, int n) ///十进制数number转化为n进制
{
SqStack S;
InitStack(&S); //初始化S
while(number)
{
Push(&S, number%n);
number = number/n;
}
int e;
while(S.top != S.base) //栈非空
{
Pop(&S, &e);
printf("%d", e);
}
return 0;
}
int main()
{
int number, n;
scanf("%d %d", &number, &n);
conversion(number, n);
return 0;
}
判断回文
#include <stdio.h>
#include<stdlib.h>
#define m 100
typedef struct
{
char data[m];
int top;
}zhan;
void init(zhan *s) //初始化栈
{
s->top=0;
}
int empt(zhan *s) //判断栈是否为空
{
if(s->top==0)
{
return 0;
}
else
{
return 1;
}
}
void push(zhan *s,char x) //入栈
{
if(s->top==m)
{
printf("栈空\n");
}
else
{
s->data[++s->top]=x;
}
}
char pop(zhan *s) //出栈
{
char y;
if(s->top==0)
{
printf("栈空\n");
return '0';
}
else
{
y=s->data[s->top];
s->top=s->top-1;
return y;
}
}
typedef struct { //定义队列
char data[m];
int front;
int rear;
}dui;
void cshdl(dui *q) //初始化队列
{
q->front=q->rear=0;
}
void rudui(dui *q,char e) //入队
{
if((q->rear+1)%m==q->front)
{
printf("队列为空\n");
}
else
{
q->data[q->rear]=e;
q->rear=(q->rear+1);
}
}
char chudui(dui *q) //出对
{
char f;
if(q->front==q->rear)
{
printf("队列为空\n");
return 0;
}
else
{
f=q->data[q->front];
q->front=(q->front+1);
return f;
}
}
int main()
{
char c;
int y=0;
zhan *s=(zhan *)malloc(sizeof(zhan));
dui *q=(dui *)malloc(sizeof(dui));
init(s);
cshdl(q);
printf("输入一个字符串:\n");
while((c=getchar())!='\n')
{
push(s,c);
rudui(q,c);
}
while(empt(s))
{
if(pop(s)==chudui(q))
{
y=1;
continue;
}
else
{
y=0;
break;
}
}
if(y==1)
printf("此字符串为回文\n");
else
printf("此字符串不是回文\n");
return 0;
}