有了基础的框架,就要有实践的真知,所以我不断完善自己,遇到更好的代码,实现更加功能完美的代码。
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include "string"
#define NULL 0
#define OK 1
#define ERROR 0
typedef int datatype;
typedef struct node //定义链式栈结构
{
datatype data;
struct node* next;
}StackNode, * LinkStack;
//置空栈
int Init_LinkStack(LinkStack & S)
{
S = NULL; //讲栈指针置空
return 0;
}
//入栈
int Push_LinkStack(LinkStack& top, datatype x)
{
LinkStack p = new StackNode; //生成新的节点
if (!p) return ERROR;
p->data = x;
p->next = top;
top = p;
return 0;
}
//出栈
int Pop_LinkStack(LinkStack& top)
{
LinkStack p = new StackNode;
if (top == NULL) //栈空
return ERROR;
p = top; //用p临时保存栈顶空间,以备释放
top = top->next; //修改栈顶指针
free(p); //释放原栈顶元素的空间
return 0;
}
void printstack(LinkStack top)
{
StackNode* p = top;
while (p != NULL)
{
printf("%d->", p->data);
p = p->next;
}
}
//顺序栈
#define MAXSIZE 1024
typedef struct
{
datatype data[MAXSIZE];
int top;
}SeqStack;
//顺序栈置空栈:首先建立栈空间,然后初始化栈顶指针。
SeqStack* Init_SeqStack()
{
SeqStack* s;
s = new SeqStack;
s->top = -1;
return s;
}
//顺序栈判空栈
int Empty_SeqStack(SeqStack* s)
{
if (s->top == -1) return 1;
else return 0;
}
//顺序栈入栈
int Push_SeqStack(SeqStack* s, datatype x)
{
if (s->top == MAXSIZE - 1) return 0; //栈满不能入栈
else {
s->top++;
s->data[s->top] = x;
return 1;
}
}
//顺序栈出栈
int Pop_SeqStack(SeqStack* s, datatype* x)
{
if (Empty_SeqStack(s)) return 0; //栈空不能出栈
else {
*x = s->data[s->top];
s->top--; return 1; //栈顶元素存入*x,返回
}
}
void conversion(int N, int r)
{
SeqStack* s;
datatype x;
s = Init_SeqStack(); //初始化栈
printf("\n %d 的十进制数转换成 %d 进制\n ", N, r);
while (N)
{
Push_SeqStack(s, N % r); //余数入栈
N = N / r; //商作为被除数继续
}
printf("转换后的结果如下:");
while (!Empty_SeqStack(s))
{
Pop_SeqStack(s, &x);
printf(" %d ", x);
}
}
void main()
{
LinkStack top;
Init_LinkStack(top);
int i, j, k;
datatype x;
datatype y;
do
{
printf("\n\n\n\n");
printf("\t\t\t 栈的应用子系统\n");
printf("\t\t*******************************\n");
printf("\t\t* 1----链式初始化 *\n");
printf("\t\t* 2----链式进栈 *\n");
printf("\t\t* 3----链式出栈 *\n");
printf("\t\t* 4----链栈显示 *\n");
printf("\t\t* 5----进制转换 *\n");
printf("\t\t* 0----返 回 *\n");
printf("\t\t*******************************\n");
printf("\t\t 请选择菜单项(0-5):");
scanf_s("%d", &k); getchar();
switch (k)
{
case 1: //进栈
printf("\n 请输入要进栈的个数:");
scanf_s("%d", &j);
printf("\n 请输入要进栈的数据X:");
for(i=0;i<j;i++)
{
scanf_s("%d", &x);
Push_LinkStack(top, x);
}
printstack(top);
break;
case 2:
printf("\n 请输入想要插入栈的数:");
scanf_s("%d",&y);
Push_LinkStack(top, y);
printf("\n 插入栈后的链栈是:");
printstack(top);
break;
case 3: //出栈
printf("出栈后的数据为:");
Pop_LinkStack(top);
printstack(top);
break;
case 4: //打印链式栈中的元素
printf("\n 链式栈的元素有:");
printstack(top);
break;
case 5: //进制转换
int N, r;
printf("\n 请输入一个整数N=");
scanf_s("%d", &N);
printf("\n 请输入一个要转换的进制数r=");
scanf_s("%d", &r);
conversion(N, r);
break;
}
} while (1);
}