1.实验所涉及的知识点
(1)C语言的指针知识。
(2)顺序表的操作。
(3)栈的后进先出原理。
(4) 空栈、入栈、出栈、取栈顶元素等操作
(5) 栈的实际应用,进制转换
2.程序源码
#include "stdafx.h"
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#define stack_size 5 //存储空间初始分配量
#define stack_add 1 //存储空间分配增量
#define error 0
#define ok 1
typedef int Elemtype;
typedef int Statuse;
typedef struct{ //定义栈
Elemtype *base; //在构造栈前和销毁后,base的值为NULL
Elemtype *top;//栈顶指针
int stacksize;//当前已分配的存储空间
}sql_stack;
Statuse stack_creat(sql_stack &L)//构建空栈L
{
L.base=(Elemtype *)malloc(stack_add*sizeof(Elemtype));
if(!L.base)
exit (error);
L.top=L.base;
L.stacksize=stack_size;
return ok;
}
Statuse stack_push(sql_stack &L,int m)//插入元素m为新的栈顶元素
{
if((L.top-L.base)>=L.stacksize)//栈满,追加存储空间
{
L.base=(Elemtype *)realloc(L.base,(stack_add+L.stacksize)*sizeof(Elemtype));
if(!L.base)
exit(0);
L.top=L.base+L.stacksize;
L.stacksize+=stack_add;
}
*L.top=m;
L.top++;
return ok;
}
Statuse stack_pop(sql_stack &L,int &n)//若栈不空,则删除L的栈顶元素,并用n返回其值
{
if(L.top==L.base)
return error;
L.top--;
n=*L.top;
return ok;
}
void stack_convert()//进制转换
{
sql_stack L;
stack_creat(L);//重新创建空的栈,分配内存空间
int k,n,e;
printf("/n请输入你要转换的数字:");
scanf("%d",&k);
printf("请输入你要转换的进制:");
scanf("%d",&n);
while(k)
{
stack_push(L,k%n);
k=k/n;
}
for(int i=0;i<L.stacksize;i++)
{
stack_pop(L,e);
printf("%d",e);
}
}
int main()
{
sql_stack L;
stack_creat(L);
int k,e;
printf("入栈的元素:/n");
for(int i=0;i<L.stacksize;i++)
{
scanf("%d",&k);
stack_push(L,k);
}
printf("出栈的元素:");
for(int i=0;i<L.stacksize;i++)
{
stack_pop(L,e);
printf("%d",e);
}
stack_convert();//转换进制
printf("/n");
system("pause");
return 0;
}