5.顺序栈和链栈的基本算法实现

1.编写一个程序实现顺序栈(假设栈中元素类型 ElemType 为char)
的各种基本运算完成如下功能:
(1)初始化栈s。
(2)判断栈s是否非空。
  (3)依次进栈元素a、b、c、d、e。
(4)判断栈s是否非空。
(5)输出出栈序列。
(6)判断栈s是否非空。
(7)释放栈
代码如下:

#include<stdio.h>
#include<stdlib.h>
#define max 100
typedef char elemtype;
typedef struct
{
	elemtype data[max];
	int top;  //栈顶
}Sqstack;     //说明顺序栈类型
void initstack(Sqstack *&s)           //初始化顺序栈
{
	s = (Sqstack*)malloc(sizeof(Sqstack));
	s->top = -1;
}
void destorystack(Sqstack*& s)         //销毁顺序栈
{
	free(s);
}
bool stackempty(Sqstack*s)           //判断栈是否为空
{
	return s->top == -1;
}
bool push(Sqstack*& s, elemtype e)    //进栈
{
	if (s->top == max - 1)
	{
		return false;
    }
	s->top++;
	s->data[s->top] = e;
	return true;
}
bool pop(Sqstack*& s, elemtype &e)   //出栈
{
	if (s->top == -1)
	{
		return false;
	}
	e = s->data[s->top];
	s->top--;
	return true;
}
bool gettop(Sqstack* s, elemtype& e) //取栈顶元素
{
	if (s->top == -1)
	{
		return false;
	}
	e = s->data[s->top];
	return true;
}
int main()
{
	elemtype e;
	Sqstack *s;
	printf("顺序栈的基本算法如下\n");
	printf("1.初始化栈s\n");
	initstack(s);
	printf("2.栈为:%s \n", (stackempty(s) ? "空" : "非空"));
	printf("3.依次进栈元素abcde\n");
	push(s, 'a');
	push(s, 'b');
	push(s, 'c');
	push(s, 'd');
	push(s, 'e');
	printf("4..栈为:%s \n", (stackempty(s) ? "空" : "非空"));
	printf("5.出栈序列:\n");
	while (!stackempty(s))
	{
		pop(s, e);
		printf("%c", e);
	}
	printf("\n");
	printf("6.栈为:%s \n", (stackempty(s) ? "空" : "非空"));
	printf("7.释放栈\n");
	destorystack(s);
	return 1;
}

值得注意的是,在栈中判断栈是否为空的条件应该是top==-1而不是top==0.

运行结果如下

 2.内容:编写一个程序实现链栈(假设栈中元素类型ElemType为char)的
各种基本运算,完成如下功能:
(1)初始化栈s。
(2)判断栈s是否非空。
(3)依次进栈元素a、b、c、d、e。
(4)判断栈s是否非空。
(5)输出出栈序列。
(6)判断栈s是否非空。
(7)释放栈。

代码如下:

#include<stdio.h>
#include<stdlib.h>
typedef char elemtype;
typedef struct linknode
{
	elemtype data;           //数据域
	struct linknode* next;    //指针域
}linkstnode;     //链栈类型定义
void initstack(linknode*&s)           //初始化链栈
{
	s = (linkstnode*)malloc(sizeof(linkstnode));
	s->next = NULL;
}
void destorystack(linknode*& s)         //销毁链栈
{
	linkstnode* p = s->next;
	while (p != NULL)
	{
		free(s);
		s = p;
		p = p->next;
	}
	free(s);
}
bool stackempty(linknode*s)           //判断栈是否为空
{
	return s->next == NULL;
}
void push(linknode*& s, elemtype e)    //进栈
{
	linkstnode* p;
	p = (linkstnode*)malloc(sizeof(linkstnode));
	p->data = e;
	p->next = s->next;
	s->next = p;
}
bool pop(linknode*& s, elemtype &e)   //出栈
{
	linkstnode* p;
	if (s->next == NULL)
	{
		return false;
	}
	p = s->next;
	e = p->data;
	s->next = p->next;
	free(p);
	return true;

}
bool gettop(linknode* s, elemtype& e) //取栈顶元素
{
	if (s->next == NULL)
	{
		return false;
	}
	e = s->next->data;
	return true;
}
int main()
{
	elemtype e;
	linknode*s;
	printf("链栈的基本算法如下\n");
	printf("1.初始化栈s\n");
	initstack(s);
	printf("2.栈为:%s \n", (stackempty(s) ? "空" : "非空"));
	printf("3.依次进栈元素abcde\n");
	push(s, 'a');
	push(s, 'b');
	push(s, 'c');
	push(s, 'd');
	push(s, 'e');
	printf("4..栈为:%s \n", (stackempty(s) ? "空" : "非空"));
	printf("5.出栈序列:\n");
	while (!stackempty(s))
	{
		pop(s, e);
		printf("%c", e);
	}
	printf("\n");
	printf("6.栈为:%s \n", (stackempty(s) ? "空" : "非空"));
	printf("7.释放栈\n");
	destorystack(s);
	return 1;
}

与顺序栈大致框架相同,注意出入栈时s指向统一。

运行结果如下:

至此栈的存储结构告一段落,下期将实现环形队列与链队的基本算法^_^

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值