算法中运用栈操作对数据进行显示,入栈,出栈,进制转换一体设计

有了基础的框架,就要有实践的真知,所以我不断完善自己,遇到更好的代码,实现更加功能完美的代码。

#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);
}

遇见美好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值