链栈、顺序栈的基本操作:定义结构的不同,入栈,出栈的区别,取栈顶元素,以及用链栈将十进制的数转换成二进制和用顺序栈存储输入的整数,当ai不等于-1时,ai进栈;当ai等于-1时,输出栈顶整数并出栈

√1、请实现顺序栈的基本操作(定义顺序栈结构,初始化,获取栈顶元素,出栈,入栈等操作)。
√2、请实现链栈的基本操作(定义顺序栈结构,初始化、获取栈顶元素,出栈,入栈等操作)。
√3、在题1的基础上完成:从键盘输入一整数的序列:a1,a2,a3……an,试编写算法实现:用栈结构存储输入的整数,当ai不等于-1时,ai进栈;当ai等于-1时,输出栈顶整数并出栈.算法应对异常情况(入栈满等)给出相应的信息.
√4、题2的基础上完成数制转换:请把一个十进制数N转换为d进制数(数值仅能为2,8,16),并输出.(实现时,请采用链式存储).

一对一:是指除了第一个元素和最后一个元素,其他元素都只有一个直接前驱和一个直接后继

随机存取:是因为我们可以通过查找地址,通过地址直接对元素进行修改

链表则是顺序:是因为链表在通过指针依次指向下一个节点,直到表尾.

 

 

栈底是表头,栈顶是表尾。(栈底是不动的那一方,我们修改的是栈顶)

无论是顺序表还是顺序栈,只要是顺序存储,都是申请一段连续的空间

前提:在进行栈的操作,一定要预设栈顶指针top

top指针:指向的是入站元素即将如的下一个位置

元素的个数:用top指针减去base指针

链栈

运算是受限的单链表,只能在链表头部进行操作,故没必要附加头结点。栈顶指针就是链表的头指针。

栈的运用:用于数制转换,将十进制转换成八进制、二进制、十六进制等等

//链栈的操作

#include<stdio.h>
#include<stdlib.h>
#include<stack>
#define OK 1
#define ERROR 0
#define INIT_STACK_SIZE 200
#define STACKINCREAM 10
typedef int Status;
typedef int SlemType;
/*
√1、请实现链栈的基本操作(定义顺序栈结构,初始化、获取栈顶元素,出栈,入栈等操作)。
√2、基础上完成数制转换:请把一个十进制数N转换为d进制数(数值仅能为2,8,16),并输出.(实现时,请采用链式存储).
*/

//定义链栈的结构
typedef struct StackNode
{
	SlemType data;
	struct StackNode *next;
}StackNode,*LinkStack;

//初始化链栈
Status InitStack(LinkStack &s)
{
	s = NULL;
	return OK;
}

//判断栈是否为空
Status StackEmpty(LinkStack s)
{
	if (s == NULL)
		return OK;
	return ERROR;
}

//进栈
Status Push(LinkStack &s, SlemType e)
{
	LinkStack p = (StackNode*)malloc(sizeof(StackNode));
	if (!p)
		return ERROR;
	p->data = e;
	p->next = s;
	s = p;
	return OK;
}

//出栈
Status Pop(LinkStack &s, SlemType &e)
{
	if (s == NULL)
		return ERROR;
	LinkStack p = s;//定义一个指针p保存s的地址
	e = s->data;//e保存s的数据
	s = s->next;//s保存s的next
	free(p);
	return OK;
}

//取栈顶元素
Status GetTop(LinkStack s,SlemType &e)
{
	if (s == NULL)//判断指针是否为空
		return -1;
	e = s->data;
	return e;
}

//清空栈
Status Clearstack(LinkStack &s)
{
	LinkStack p;
	while (s)
	{
		p = s->next;
		free(s);
		s = p;
	}
	return OK;
}

//数值转换
void Conversion2(SlemType n)//转化为二进制
{
	LinkStack s;
	InitStack(s);
	SlemType e;
	while (n)
	{
		Push(s, n % 2);
		n = n / 2;
	}
	while (s)
	{
		Pop(s, e);
		printf("%d", e);
	}
	printf("\n");
}

int main()
{
	/*
	LinkStack s;
	SlemType e;
	InitStack(s);
	for (int i = 1; i <= 5; i++)
		Push(s, i);
	//printf("\n栈顶元素为:%d\n", GetTop(s, e));//放在这里不能运行?
	for (int i = 1; i <= 5; i++)
	{
		Pop(s, e);
		printf("%d ", e);
	}
	printf("\n栈顶元素为:%d\n", GetTop(s, e));
	printf("\n");
	 */
	Conversion2(22);

return OK;

}
#include<stdio.h>
#include<stdlib.h>
#include<stack>
#define OK 1
#define ERROR 0
#define INIT_STACK_SIZE 200
#define STACKINCREAM 10
typedef int Status;
typedef int SlemType;
/*
√1、请实现顺序栈的基本操作(定义顺序栈结构,初始化,获取栈顶元素,出栈,入栈等操作)。
√2、从键盘输入一整数的序列:a1,a2,a3……an,试编写算法实现:用栈结构存储输入的整数,当ai不等于-1时,ai进栈;当ai等于-1时,输出栈顶整数并出栈.算法应对异常情况(入栈满等)给出相应的信息.
*/

//定义顺序栈
typedef struct
{
	SlemType*base;
	SlemType*top;
	int stacksize;
}Sqstack;

//初始化顺序栈
Status Initstack(Sqstack &s)
{
	s.base = (SlemType*)malloc(sizeof(SlemType)*INIT_STACK_SIZE);
	if (!s.base)
		return ERROR;
	s.top = s.base;
	s.stacksize = INIT_STACK_SIZE;
}

//判断是否空栈
Status Stackempty(Sqstack s)
{
	if (s.base == s.top)
		return OK;
	return ERROR;
}

//获取栈中元素的个数
Status Stacklength(Sqstack s)
{
	return s.top - s.base;
}

//清空栈
Status Clearstack(Sqstack &s)
{
	if (s.base)
		s.top = s.base;
	return OK;
}

//销毁栈
Status Destorystack(Sqstack &s)
{
	if (s.base)
		free(s.base);
	s.top = s.base = NULL;
	s.stacksize = 0;
	return OK;
}

//入栈操作
Status Push(Sqstack &s,SlemType e)
{
	if (s.top - s.base >= s.stacksize)//判断栈中元素是否满了,如果满了,就会有如下申请空间的操作
	{
		s.base = (SlemType*)realloc(s.base, sizeof(SlemType)*(INIT_STACK_SIZE + STACKINCREAM));//动态空间分配
		if (!s.base)//判断栈底是否为空
			return ERROR;
		s.top = s.base + s.stacksize;//栈顶指针移动
		s.stacksize = INIT_STACK_SIZE + STACKINCREAM;
	}

	*s.top = e;//将e的值赋值给top位置
	s.top++;//然后将top指针指向下一个空间的位置
	//*s.top++=e;	这两句可以合并成一句
	return OK;
}

//出栈操作
Status Output(Sqstack &s,SlemType &e)
{
	if (s.top == s.base)//判断栈的元素是否为空
		return ERROR;
	s.top--;//top指针往下移
	e = *s.top;//将原先top指向的元素保存在e元素中
	printf("%d\n", e);
	return OK;
}

//取顺序栈栈顶元素 
Status GetTop(Sqstack s, SlemType &e)
{
	if (s.top == s.base)//如果是空栈
		return ERROR;
	e = *(s.top - 1);
	printf("%d ", e);
	//为什么不能用 e=*(s.top--);虽然e最后得到的值都是一样的
	//原因:因为e=*(s.top--)使top指针保存的地址被改变了,而e = *(s.top - 1)中的top指针保存的地址没有改变的,只是top指针向下移动。
}

//在顺序栈的基础上完成:从键盘输入一整数的序列:a1,a2,a3……an,试编写算法实现:用栈结构存储输入的整数,当ai不等于-1时,ai进栈;当ai等于-1时,输出栈顶整数并出栈.算法应对异常情况(入栈满等)给出相应的信息.
Status OutputStruck(Sqstack &s, SlemType &e)
{
	SlemType e1=e;
	Sqstack s1=s;
	Initstack(s1);
	for (e = 3; e > -3; e--)
	{
		if (s1.top - s1.base >= s1.stacksize)//是否栈满的情况
		{
			printf("栈已满,无法输入数据,操作失败!\n");
			return ERROR; 
		}			
		Push(s1, e);
		if (e == -1)//当ai等于-1时,输出栈顶整数并出栈顶整数并出栈
		{
			printf("栈顶元素为:");
			GetTop(s1, e1);
			printf("\n");
			printf("出栈后为:\n");
			for (e1; e1 > -3;e1--)
			Output(s1, e1);
			return ERROR;
		}
	}	
}
int main()
{
	SlemType e;
	Sqstack s;
	OutputStruck(s, e);
	return 0;
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值