数据结构与算法-栈

#include <iostream>
#include <cstring>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
using namespace std;

typedef int Status;
typedef char SElemType;

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

Status InitStack(SqStack &S){
	S.base=new SElemType[MAXSIZE];
	if(!S.base)
		exit(OVERFLOW);
	S.top=S.base;
	S.stacksize=MAXSIZE;
	return OK;
}

Status Push(SqStack &S,SElemType e){
	if(S.top-S.base==MAXSIZE)
		return ERROR;
	*(S.top++)=e;
	return OK;
		
}

Status Pop(SqStack &S,SElemType &e){
	if(S.top==S.base)
		return ERROR;
	e = *(--S.top);
	return OK;
}

char GetTop(SqStack S){
	if(S.top!=S.base)
		return *(S.top-1);
}

int main(){
	SqStack s;
	int choose,flag=0;
	string j;
	SElemType e,t;
	cout<<"1.初始化\n";
	cout<<"2.入栈\n";
	cout<<"3.取栈顶元素\n";
	cout<<"4.出栈\n";
	cout<<"5.退出\n";
	choose =-1;
	while(choose!=0){
		cout<<"请选择:";
		cin>>choose;
		switch(choose){
			case 1:
				if(InitStack(s)){
					flag=1;
					cout<<"初始化成功!\n";
				}
				else
					cout<<"初始化失败!\n";
				break;
			case 2:
				cout<<"请输入要入栈的字符串:";
				cin>>j;
				if(flag){
					flag=1;
					cout<<"进栈的元素依次是:\n";
					for(int i=0;i<j.length();i++){
						Push(s,j[i]);
						cout<<j[i]<<" ";
					} 
					cout<<endl;
				}
				else
					cout<<"栈未建立,请重新选择\n";
				break;
			case 3:
				if(flag!=-1&&flag!=0){
					cout<<"栈顶元素为:"<<GetTop(s)<<endl;
				}
				else
					cout<<"栈中无元素,请重新选择\n";
				break;
			case 4:
				cout<<"依次弹出的栈顶元素为:";
				while(Pop(s,t)){
					flag =-1;
					cout<<t<<" ";
				}
				cout<<endl;
				break; 
			case 5:
				return 0;
		}
	} 
	return 0;
	
}


下面是带有注释解释版本,解释每行话的作用

#include <iostream>
#include <cstring> //包含字符串处理的头文件 ,用于使用字符相关的函数
using namespace std; 


#define OK 1
#define ERROR 0
#define OVERFLOW -2

#define MAXSIZE  100
typedef int Status;
typedef char SElemType;//给char起了一个别名SElemType,用于表示栈中的元素类型
 //栈的类型定义 
typedef struct{
	SElemType *base;//指向栈底的指针,是栈的起始地址 
	SElemType *top;//指向栈顶的指针 
	int stacksize;//记录栈得我当前容量,也就是栈能容纳的元素个数 
}SqStack; //定义了结构体SqStack,表示顺序栈的结构 
 //初始化栈 
Status InitStack(SqStack &S){
	S.base=new SElemType[MAXSIZE];//用new动态分配内存空间,创建一个大小为MAXSIZE的数组,作为栈的存储空间,将其地址赋值给S.base 
	if(!S.base)
	exit(OVERFLOW);//检查是否成功分配内存 
	S.top=S.base;//将栈顶指针指向栈底指针表示栈为空;
	S.stacksize=MAXSIZE;//设置栈的容量为100,表示栈的最大存储空间 
	return OK; 	
} 
//进栈函数 
Status Push(SqStack &S,SElemType e){
	if(S.top-S.base==S.stacksize)
	return ERROR;//检查栈是否已满 
	*(S.top++)=e; //如果栈未满,将元素e赋值给栈顶指向的位置,然后将栈顶指针递增一位; 
	return OK;	
} 
//出栈函数
Status Pop(SqStack &S,SElemType &e){
	if(S.top==S.base)
	return ERROR;
	e = *(--S.top);//如果栈不为空,将栈顶指针递减一位,然后将该位置的值赋值给e 
	return OK;
} 

//取栈顶元素
char GetTop(SqStack S){
	if(S.top!=S.base)
	return *(S.top-1);
}

int main(){
 	SqStack s;//定义了一个顺序栈,用与存储字符元素
	int choose,flag=0; //flag是标志变量,用于标记栈的状态
	string j; //定义字符串j,用于存储用户输入的字符序列
	SElemType e,t;//用于辅助栈的操作
	cout<<"1.初始化\n";
	cout<<"2.入栈\n";
	cout<<"3.取栈顶元素\n";
	cout<<"4.出栈\n";
	cout<<"0.退出程序\n";
 	choose = -1;
	while(choose!=0){
		cout<<"请选择:";
		cin>>choose;
		switch (choose) {
			case 1://初始化 
				if(InitStack(s) )
				{
					flag = 1;
					cout<<"成功对栈进行初始化\n\n";
					
				}
				else
				    cout<<"初始化栈失败\n\n";
				break;
			case 2://入栈 
				cout<<"请输入要入栈的字符序列(例如ABCD):";
				cin>>j;//用于接收用户输入的字符序列
				if(flag){
					flag = 1;
					cout<<"进栈的元素依次为:\n";
					for(int i=0;i<j.length();++i){
						Push(s,j[i]);
						cout<<j[i]<<" ";
					}
					cout<<endl<<endl;
					
				} 
				else
				  cout<<"栈未建立,请重新选择\n";
				break;
			case 3:
				if(flag!=-1&&flag!=0){
					cout<<"栈顶元素为:"<<GetTop(s)<<endl<<endl;
				}
				else{
					cout<<"栈中无元素,请重新选择\n";
				}
                break;
            case 4:
				cout<<"依次弹出的栈顶元素为:"; 
				while(Pop(s,t)){
					flag = -1;
					cout<<t<<" ";
				} 
				cout<<endl<<endl;
				break;
			default:
				//TODO
				break;
		}
	} 
 	

 	return 0;
 }







评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注