数据结构:顺序栈

YUEXIABUG2022年4月7日
大约 3 分钟

数据结构:顺序栈

实验目标:

提示

(1)初始化栈

(2)将元素e入栈

(3)出栈,用e返回出栈元素

(4)返回栈顶元素

(5)清空栈

(6)遍历栈元素(从栈底到栈顶)

(7)进制转换函数,将十进制dec数转化为n进制数,并输出转换后结果


实验代码

#include <iostream>
using namespace std;

#define TRUE         1
#define FALSE        0
#define OK           1
#define ERROR        0
#define INFEASIBLE  -1
#define OVERFLOW    -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT  10

typedef int Status;
typedef int SElemType;

typedef struct{
	SElemType *base;
	SElemType *top;
	int stacksize;
}SqStack;

Status InitStack(SqStack &S)//初始化栈,构造一个空栈
{
	S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if(!S.base) exit(OVERFLOW);//分配存储空间失败
	S.top=S.base;
	S.stacksize=STACK_INIT_SIZE;

	return  OK;
}

Status Push(SqStack &S,SElemType e)//将元素e入栈
{
	if(S.top-S.base >= S.stacksize){//若已经满栈,就追加存储空间
		S.base = (SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));

		if(!S.base) exit(OVERFLOW);//分配存储空间失败

		S.top = S.base + S.stacksize;
		S.stacksize += STACKINCREMENT;
	}

	*S.top++ =e;
	return OK;
}

Status Pop(SqStack &S,int &e)//出栈,用e返回出栈元素
{
	if(S.top == S.base) return ERROR;//若栈为空,则返回ERROR
	e=*--S.top;
	return OK;
}

Status GetTop(SqStack &S)//返回栈顶元素
{
	if(S.top == S.base) return ERROR;//判断栈是否存在
	int e = *(S.top-1);
	cout<<"栈顶元素为:"<<e;
	cout<<endl;
	return OK;
}

void  ClearStack(SqStack &S)//清空栈
{
	if(S.top == S.base) cout<<"清空失败,栈不存在!"<<endl;//判断栈是否存在

	else{
		delete S.base;
		S.stacksize=0;
		S.base=S.top=NULL;
	    cout<<"清空成功!"<<endl;
	}
}

void Traverse(SqStack &S)//遍历栈元素(从栈底到栈顶)
{
	if(S.top == S.base) cout<<"遍历失败,栈不存在!"<<endl;//判断栈是否存在
	
	for(int *p=S.base;p<S.top;*p++){
		int e=*p;
		cout<<e<<" ";
	}
	cout<<endl;
}

void Convert(int dec ,int n)//进制转换函数,将十进制dec数转化为n进制数,并输出转换后结果
{
	SqStack S;
	InitStack(S);
	
	int e;
	while(dec){
		e=dec%n;
		dec/=n;
		Push(S,e);
	}

	cout<<"转换后为:";

	while(S.top!=S.base){
		Pop(S,e);
		if(e>=10) cout<<(char)('A'+e-10);
		else cout<<e;
	}
	cout<<endl;
}

int main()
{
	SqStack S;
	int e;
	
	while(1){
		cout<<endl;
		cout<<"**1,初始化栈"<<endl;
		cout<<"**2,将元素e入栈"<<endl;
	    cout<<"**3,出栈,用e返回出栈元素"<<endl;
	    cout<<"**4,返回栈顶元素"<<endl;
		cout<<"**5,清空栈"<<endl;
		cout<<"**6,遍历栈元素(从栈底到栈顶)"<<endl;
        cout<<"**7,进制转换函数,将十进制dec数转化为n进制数,并输出转换后结果"<<endl;
		cout<<"**0,退出系统"<<endl;

		int choice;
		cout<<"请输入要进行的操作:";
		cin>>choice;
		cout<<endl;

		switch(choice){
			case 1:InitStack(S);break;
			case 2:{
				int n;
				cout<<"请输入本次入栈的元素个数:";
				cin>>n;

				cout<<endl<<"请输入要插入的元素:";
				for(int i=1;i<=n;i++){
					cin>>e;
					Push(S,e);
				}
				cout<<"入栈成功!";
				cout<<endl<<"本次插入的元素如下:";
				Traverse(S);
				break;
			}
			case 3:{
				int n;
				cout<<"请输入本次出栈的元素个数:";
				cin>>n;

				cout<<endl;
				for(int i=n;i>0;i--) Pop(S,e);
				cout<<"出栈成功!"<<endl;
				cout<<"剩下的元素为:";
				Traverse(S);
				break;
			}
			case 4:GetTop(S);break;
			case 5:ClearStack(S);break;
			case 6:Traverse(S);break;
			case 7:{
				int dec,n;
				cout<<"请输入要转换的十进制数:";
				cin>>dec;
				cout<<endl<<"请输入要转换到几进制数:";
				cin>>n;
				cout<<endl;

				if(n!=2 && n!=8 && n!=16) cout<<"输入错误!"<<endl;
				else Convert(dec,n);
				break;
			}
			case 0:exit(0);

		}
	}

	system("pause");
	return 0;
}
评论
Powered by Waline v2.6.1