(8)栈

  栈是只允许在表尾进行插入、删除的线性表。对栈来说,表尾有特殊的含义,我们将表尾称为栈顶,而表的另一端,即表头称为栈底。不含元素的空表称为空栈。由其定义可以看出先进入栈的元素最后才能出栈,所以栈又被称为后进先出的线性表。
    若栈满,执行进栈则发生上溢。若栈空,执行退栈则发生下溢。



栈分两种:
1)利用顺序存储结构实现的栈称为顺序栈
2)利用链式存储结构实现的栈称为链栈

两种栈的基本实现操作:
1)Init()   初始化
2) Empty()  判栈空
3) Push()   入栈
4) Pop()    出栈
5) GetTop() 读栈顶元素
6)Clear()  清空栈

7)Length() 求栈长


代码(顺序栈):

#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef int ElemType;
typedef struct {
	ElemType data[MAXSIZE];
	int top;
}Stack;
Stack Init() {
	Stack s;
	s.top = -1;
	return s;
}
void Empty(Stack s) {
	if (s.top == -1) {
		cout <<"栈为空!" << endl;
	}
	else cout << "栈不为空!" << endl;
}
Stack Push(Stack s,ElemType a) {
	if (s.top == MAXSIZE - 1) {
		cout << "栈满!压栈失败!" << endl;
	}
	else {
		s.top++;
		s.data[s.top] =a;
		cout << "压栈成功!" << endl;
	}
	return s;
}
Stack Pop(Stack s) {
	if (s.top == -1) {
		cout << "栈为空!没有元素出栈" << endl;
	}
	else {
		cout << s.data[s.top] << endl;
		s.top--;
	}
	return s;
}
void GetTop(Stack s) {
	if (s.top != -1) {
		cout << "栈顶元素是:" << s.data[s.top] << endl;
	}
	else {
		cout << "空栈,没有栈顶元素" << endl;
	}
}
Stack clear(Stack s) {
	s.top = -1;
	cout << "清除成功!" << endl;
	return s;
}
void Length(Stack s) {
	cout << "栈的长度为:" << s.top+1<< endl;
}
void print() {
	cout << "*******************************************" << endl;
	cout << "*   1判断栈是否为空          2入栈        *" << endl;
	cout << "*   3出栈                    4读栈顶元素  *" << endl;
	cout << "*   5清空栈                  6求栈长      *" << endl;
	cout << "*   7 清屏                   8 退出       *" << endl;
	cout << "*******************************************" << endl;
}
void main() {
	int i,x;
	Stack s = Init();
	print();
	while (1) {
		cin >> i;
		switch (i)
		{
		case 1:Empty(s); break;
		case 2:cin >> x; s=Push(s, x); break;
		case 3:s=Pop(s); break;
		case 4:GetTop(s); break;
		case 5:s=clear(s); break;
		case 6:Length(s); break;
		case 7:system("cls"); print(); break;
		case 8:exit(0); break;
		default:cout << "输出值超出范围,请重新输入!"<<endl; break;
		}
	}
    
}
代码(链栈):

#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef int ElemType;
typedef struct StackNode{
	ElemType data;
	StackNode *next;
}StackNode,*LinkedStack;
LinkedStack Init() {
	LinkedStack s;
	s = NULL;
	return s;
}
void Empty(LinkedStack s) {
	if (s == NULL) {
		cout <<"栈为空!" << endl;
	}
	else cout << "栈不为空!" << endl;
}
LinkedStack Push(LinkedStack s,ElemType a) {
	LinkedStack p = (StackNode*)malloc(sizeof(StackNode));
	p->data = a;
	p->next = s;
	s = p;	
	cout << "压栈成功!" << endl;	
	return s;
}
LinkedStack Pop(LinkedStack s) {
	if (s==NULL) {
		cout << "栈为空!没有元素出栈" << endl;
	}
	else {
		cout << s->data << endl;
		s = s->next;
	}
	return s;
}
void GetTop(LinkedStack s) {
	if (s != NULL) {
		cout << "栈顶元素是:" << s->data << endl;
	}
	else {
		cout << "空栈,没有栈顶元素" << endl;
	}
}
LinkedStack clear(LinkedStack s) {
	LinkedStack p;
	while (s!= NULL) {
		p = s;
		s = s->next;
		free(p);
	}
	cout << "清除成功!" << endl;
	return s;
}
void Length(LinkedStack s) {
	int i = 0;
	while (s!=NULL) {
		i++;
		s = s->next;
	}
	cout << "栈的长度为:" << i << endl;
}
void print() {
	cout << "*******************************************" << endl;
	cout << "*   1判断栈是否为空          2入栈        *" << endl;
	cout << "*   3出栈                    4读栈顶元素  *" << endl;
	cout << "*   5清空栈                  6求栈长      *" << endl;
	cout << "*   7 清屏                   8 退出       *" << endl;
	cout << "*******************************************" << endl;
}
void main() {
	int i,x;
	LinkedStack s = Init();
	print();
	while (1) {
		cin >> i;
		switch (i)
		{
		case 1:Empty(s); break;
		case 2:cin >> x; s=Push(s, x); break;
		case 3:s=Pop(s); break;
		case 4:GetTop(s); break;
		case 5:s=clear(s); break;
		case 6:Length(s); break;
		case 7:system("cls"); print(); break;
		case 8:exit(0); break;
		default:cout << "输出值超出范围,请重新输入!"<<endl; break;
		}
	}
    
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值