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 << "依次彈出的棧頂元素為:\n";
	while (Pop(S,value))
	{
		cout << value << "\t";
	}
}
    
int main()
{
	int opearateNum = 0;//操作值
	SqStack S;
	InitStack(S);//初始化堆棧

	while (true)
	{
		cout << "1、批量入棧\t2、全部出棧\t3、讀棧頂元素\t4、彈出棧頂元素\t5、退出" << 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 << "依次彈出的棧頂元素為:\n";
    while (Pop(S, value))
    {
        cout << value << "\t";
    }
}

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

	while (true)
	{
		cout << "1、批量入棧\t2、全部出棧\t3、讀棧頂元素\t4、彈出棧頂元素\t5、退出" << 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;
		}
	}
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM