1. 程式人生 > >stack (C++中STL庫常用stack基本用法的實現) ([連結串列],[陣列]的實現)

stack (C++中STL庫常用stack基本用法的實現) ([連結串列],[陣列]的實現)

Stack:依循先進後出原則的單調佇列.

下面是用連結串列實現的stack的幾個基本用法和一個clear()的補充用法:

#include<stdio.h>
/*
*Date:2018/10/22
*Author:Fushicho
*Name:stack連結串列版
*Function:push(),pop(),top(),emtpy(),size(),clear()
*/
struct node {
	int num;                    //節點元素
	node *pre_p;                //節點指標指向該節點的前一個節點
	node() {                    //建構函式(初始化)
		this->pre_p = NULL;
	}
};
struct stack {
private:
	node *Top;                  //棧頂指標
public:
	stack() {                   //建構函式(初始化)
		Top = NULL;
	}
	
	void push(int x) {          //向棧頂放入一個元素
		node *p = new node();
		p->num = x;
		if (emtpy()) {          //棧為空
			Top = p;
		}
		else {                  //棧不為空
			p->pre_p = Top;
			Top = p;
		}
	}

	void pop() {                //將棧頂節點彈出並釋放記憶體
		node *p = Top;
		Top = Top->pre_p;
		delete(p);
	}

	int top() {                 //獲得棧頂元素
		return Top->num;
	}

	bool emtpy() {              //判斷棧是否為空 
		return (Top != NULL) ? false : true;
	}

	int size() {               //計算棧元素個數
		node *p = Top;
		int cnt = 0;
		while (p != NULL) {
			p = p->pre_p;
			cnt++;
		}
		return cnt;
	}

	void clear() {              //清空(需要把每個節點都釋放記憶體,優點:節省記憶體,缺點:時間慢)
		node *p = Top;
		Top = Top->pre_p;
		while (Top != NULL) {
			delete(p);
			p = Top;
			Top = Top->pre_p;
		}
	}
};

void debug() {          //測試程式碼
	stack s;
	int a[] = { 1,2,3,4,5,6 };
	printf("入棧順序:\n");
	for (int i = 0; i < 6; i++) {
		printf("%d ", a[i]);
		s.push(a[i]);
	}
	printf("\n");

	printf("當前棧中元素個數為:%d\n", s.size());

	printf("出棧順序:\n");
	while (!s.emtpy()) {
		int x = s.top(); s.pop();
		printf("%d ", x);
	}
	printf("\n");
}

int main() {
	debug();
	return 0;
}

下面是用陣列實現的stack的幾個基本用法和一個clear()的補充用法:

#include<stdio.h>
const int maxn = 1e5;
/*
*Date:2018/10/22
*Author:Fushicho
*Name:stack陣列版
*Function:push(),pop(),top(),empty(),size(),clear()
*/
struct stack {
private:
	int sta[maxn];
	int Top;
public:
	stack() {            //建構函式(初始化)
		Top = -1;
	}
	
	void push(int x) {   //向棧頂放入一個元素
		sta[++Top] = x;
	}

	void pop() {         //將棧頂彈出
		Top--;
	}

	int top() {          //獲得棧頂元素
		return sta[Top];
	}

	bool empty() {       //判斷棧是否為空 
		return Top >= 0 ? false : true;
	}

	int size() {         //獲得棧中元素個數
		return Top + 1;
	}

	void clear() {       //清空(陣列模擬的優點:只需要修改棧頂編號)
		Top = -1;
	}
};

void debug() {          //測試程式碼
	stack s;
	int a[] = { 1,2,3,4,5,6 };
	printf("入棧順序:");
	for (int i = 0; i < 6; i++) {
		printf("%d ", a[i]);
		s.push(a[i]);
	}
	printf("\n");

	printf("當前棧中元素個數為:%d\n", s.size());

	printf("出棧順序:");
	while (!s.empty()) {
		int x = s.top(); s.pop();
		printf("%d ", x);
	}
	printf("\n");
}

int main() {
	debug();
	return 0;
}


若有不懂或者有寫錯的地方請在下方評論指出,謝謝~