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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
``` // sqstack.cpp #include <iostream> using namespace std; const int MAXSIZE = 100; // 定义栈的最大容量 typedef char ElemType; // 定义栈中元素类型为char struct SqStack { ElemType data[MAXSIZE]; // 存放栈中元素的数组 int top; // 栈顶指针 }; // 初始化栈 void InitStack(SqStack &s) { s.top = -1; // 栈顶指针初始化为-1,表示栈为空 } // 判断栈是否为空 bool IsEmpty(SqStack s) { return s.top == -1; } // 判断栈是否已满 bool IsFull(SqStack s) { return s.top == MAXSIZE - 1; } // 进栈 bool Push(SqStack &s, ElemType e) { if (IsFull(s)) { return false; // 栈已满,进栈失败 } s.top++; // 栈顶指针加1 s.data[s.top] = e; // 将元素e放入栈顶 return true; // 进栈成功 } // 出栈 bool Pop(SqStack &s, ElemType &e) { if (IsEmpty(s)) { return false; // 栈为空,出栈失败 } e = s.data[s.top]; // 取出栈顶元素 s.top--; // 栈顶指针减1 return true; // 出栈成功 } // 取栈顶元素 bool GetTop(SqStack s, ElemType &e) { if (IsEmpty(s)) { return false; // 栈为空,取栈顶元素失败 } e = s.data[s.top]; // 取出栈顶元素 return true; // 取栈顶元素成功 } int main() { SqStack s; InitStack(s); // 初始化栈 cout << "栈是否为空:" << IsEmpty(s) << endl; Push(s, 'a'); // 进栈元素a Push(s, 'b'); // 进栈元素b Push(s, 'c'); // 进栈元素c Push(s, 'd'); // 进栈元素d char e; Pop(s, e); // 出栈 cout << "出栈元素:" << e << endl; GetTop(s, e); // 取栈顶元素 cout << "栈顶元素:" << e << endl; cout << "栈是否为空:" << IsEmpty(s) << endl; return 0; } ``` --相关问题--: 1. 什么是顺序栈? 2. 顺序栈基本运算有哪些? 3

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值