C++学习---栈的构建及操作

一、顺序栈

  

#include <iostream>
using namespace std;
#define MAXSIZE 100 //栈的最大容量
typedef struct {
    int* base;//栈底指针
    int* top;//栈顶指针
    int stacksize;//栈可用的最大容量
}SqStack;

void InitStack(SqStack& S) {
    //构造空栈
    S.base = new int[MAXSIZE];
    if (!S.base) exit(OVERFLOW);//存储分配失败
    S.top = S.base;//top初始为base表示为空栈
    S.stacksize = MAXSIZE;
}

//入栈  
bool Push(SqStack& S, int e) {
    //插入元素e为新的栈顶元素
    if (S.top - S.base == S.stacksize) return false;//栈满
    *S.top++ = e;//元素e压入栈顶,栈顶指针加1
    return true;
}
//出栈
bool Pop(SqStack& S, int& e) {
    //删除S的栈顶元素,用e返回其值
    if (S.top == S.base) return false;//top=base表示为空栈,返回NULL
	e=*(--S.top);//栈顶指针减1,将栈顶元素赋值给e
    return true;
}
//取栈顶元素,返回S的栈顶元素,不修改栈顶指针
int GetTop(SqStack S) {
    if (S.top != S.base) return *(S.top - 1);//返回栈顶元素的值,栈顶指针不变
	return NULL;
}
//判断顺序栈S是否为空栈
bool isEmpty(SqStack S) {
	if (S.top!=S.base) return false;//不为空返回fasle
	return true;//为空返回true
}
//批量入栈
void StackInput(SqStack& S) {
	int value;
	cout << "请输入入几次栈:";
	cin >> S.stacksize;//用户输入入几次栈
	for (int i = 0; i < S.stacksize; i++) {
		cout << "请输入第" << i + 1 << "个值:";
		cin >> value;
		if (Push(S, value)) cout << "入栈成功!"<<endl;
		else cout << "入栈失败!";
	}
}
//依次弹出栈顶元素
void StackOut(SqStack& S) {
	int value;
	cout << "依次弹出的栈顶元素为:
";
	while (Pop(S,value))
	{
		cout << value << "	";
	}
}
    
int main()
{
	int opearateNum = 0;//操作值
	SqStack S;
	InitStack(S);//初始化堆栈

	while (true)
	{
		cout << "1、批量入栈	2、全部出栈	3、读栈顶元素	4、弹出栈顶元素	5、退出" << endl;
		cin >> opearateNum;
		if (opearateNum == 5)
			break;
		switch (opearateNum)
		{
		case 1:
			//入栈
			StackInput(S);
			system("pause");
			system("cls");
			break;
		case 2:
			//依次出栈
			StackOut(S);
			system("pause");
			system("cls");
			break;
		case 3:
			//读栈顶元素
			if (!isEmpty(S))cout << GetTop(S) << endl;
			else cout << "堆栈无元素!" << endl;
			system("pause");
			system("cls");
			break;
		case 4:
			//弹出栈顶元素
			int value;//弹出的值
			if (!Pop(S, value)) cout << "堆栈无元素" << endl;
			else cout << "弹出的栈顶元素的值为:" << value << endl;
			system("pause");
			system("cls");
			break;
		default:
			cout << "无效操作,请重新输入!" << endl;
			break;
		}
	}
}

  二、链栈

#include <iostream>
using namespace std;
//链栈的存储结构
typedef struct StackNode {
    int elem;//栈中的数据元素
    struct StackNode* next;
}*LinkStack;
//链栈的初始化
void InitStack(LinkStack& S) {
    S = NULL;//构造一个空栈S
}
//入栈,在栈顶插入元素e
bool Push(LinkStack &S,int e) {
    StackNode *p = new StackNode;//生成新结点
    p->elem = e;//将新结点p的数据域设置为e
    p->next = S;//将新结点插入栈顶
    S = p;//修改栈顶指针为p
    return true;
}
//出栈,删除S的栈顶元素,用第二个参数返回其值
bool Pop(LinkStack& S, int& e) {
    if (S == NULL) return false;//栈空  返回false
    e = S->elem;//将栈顶元素值赋给e
    StackNode* p = S;//用p临时保存栈顶元素空间,以备释放
    S = S->next;//修改栈顶指针
    delete p;//释放原来的栈顶内存空间
    return true;
}
//取栈顶元素,不修改栈顶指针
int GetTop(LinkStack S) {
    if (S != NULL) return S->elem;//如果栈为非空则返回栈顶元素
}
//判断链栈S是否为空栈
bool isEmpty(LinkStack S) {
	if (S != NULL) return false;//不为空返回fasle
	return true;//为空返回true
}
//批量入栈
void StackInput(LinkStack& S) {
    int value;
    int PushNum;//入栈数
    cout << "请输入入几次栈:";
    cin >> PushNum;//用户输入入几次栈
    for (int i = 0; i < PushNum; i++) {
        cout << "请输入第" << i + 1 << "个值:";
        cin >> value;
        if (Push(S, value)) cout << "入栈成功!" << endl;
        else cout << "入栈失败!";
    }
}
//依次弹出栈顶元素
void StackOut(LinkStack& S) {
    int value;
    cout << "依次弹出的栈顶元素为:
";
    while (Pop(S, value))
    {
        cout << value << "	";
    }
}

int main()
{
	int opearateNum = 0;//操作值
	LinkStack S;
	InitStack(S);//初始化堆栈

	while (true)
	{
		cout << "1、批量入栈	2、全部出栈	3、读栈顶元素	4、弹出栈顶元素	5、退出" << endl;
		cin >> opearateNum;
		if (opearateNum == 5)
			break;
		switch (opearateNum)
		{
		case 1:
			//入栈
			StackInput(S);
			system("pause");
			system("cls");
			break;
		case 2:
			//依次出栈
			StackOut(S);
			system("pause");
			system("cls");
			break;
		case 3:
			//读栈顶元素
			if (!isEmpty(S)) cout << GetTop(S) << endl;
			else cout << "堆栈为空栈!" << endl;
			system("pause");
			system("cls");
			break;
		case 4:
			//弹出栈顶元素
			int value;//弹出的值
			if (!Pop(S, value)) cout << "堆栈为空栈!" << endl;
			else cout << "弹出的栈顶元素的值为:" << value << endl;
			system("pause");
			system("cls");
			break;
		default:
			cout << "无效操作,请重新输入!" << endl;
			break;
		}
	}
}

  

原文地址:https://www.cnblogs.com/edllixiaoyu/p/13734162.html