五種編程語言解釋數據結構與算法—順序棧
目錄
1、棧的介紹
1.1、棧的基本概念
棧只允許一端進行插入或者刪除操作的線性表
特點:后進先出
1.2、棧的基本操作
2、棧的順序存儲結構
2.1、棧的邏輯示意圖
2.2、判斷棧空、棧滿和求棧長
2.3、特殊的順序棧—共享棧
3、使用C語言來實現順序棧
3.1、SeqStack.h文件中的內容
#ifndef XGP_STUDY_DEMO47_SEQSTACK_H
#define XGP_STUDY_DEMO47_SEQSTACK_H
//數組去模擬棧的順序存儲
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 1024
typedef struct SEQSTACK {
void* data[MAX_SIZE];
int size;
}SeqStack;
//1,初始化棧
SeqStack* Init_SeqStack();
//2,入棧
void Push_SeqStack(SeqStack* stack,void* data);
//3,返回棧頂元素
void* Top_SeqStack(SeqStack* stack);
//4,出棧
void* Pop_SeqStack(SeqStack* stack);
//5,判斷是否為空
int IsEmpty(SeqStack* stack);
//6,返回棧中元素的個數
int Size_SeqStack(SeqStack* stack);
//7,銷毀
void FreeSpace_SeqStack(SeqStack* stack);
//8,清空棧
void Clear_SeqStack(SeqStack* stack);
#endif //XGP_STUDY_DEMO47_SEQSTACK_H
3.2、SeqStack.c文件中的內容
#include "SeqStack.h"
//1,初始化棧
SeqStack* Init_SeqStack() {
SeqStack* stack = (SeqStack*)malloc(sizeof(SeqStack));
for(int i = 0;i < MAX_SIZE;i++) {
stack->data[i] = NULL;
}
stack->size = 0;
return stack;
}
//2,入棧
void Push_SeqStack(SeqStack* stack,void* data) {
if(stack == NULL) return;
if(data == NULL) return;
if(stack->size == MAX_SIZE) return;
stack->data[stack->size] = data;
stack->size++;
}
//3,返回棧頂元素
void* Top_SeqStack(SeqStack* stack) {
if(stack == NULL) return NULL;
if(stack->size == 0) return NULL;
return stack->data[stack->size - 1];
}
//4,出棧
void* Pop_SeqStack(SeqStack* stack) {
if(stack == NULL) return NULL;
if(stack->size == 0) return NULL;
void* save = stack->data[stack->size - 1];
stack->data[stack->size - 1] = NULL;
stack->size--;
return save;
}
//5,判斷是否為空
int IsEmpty(SeqStack* stack) {
if(stack == NULL) return -1;
if(stack->size == 0) return 1;
return 0;
}
//6,返回棧中元素的個數
int Size_SeqStack(SeqStack* stack) {
if(stack == NULL) return -1;
return stack->size;
}
//7,銷毀
void FreeSpace_SeqStack(SeqStack* stack) {
if(stack == NULL) return;
free(stack);
}
//8,清空棧
void Clear_SeqStack(SeqStack* stack) {
if(stack == NULL) return;
for(int i = 0;i < stack->size;i++) {
stack->data[i] = NULL;
}
stack->size = 0;
}
3.3、main.c文件中的內容
#include "SeqStack.h"
typedef struct PERSON {
char name[64];
int age;
}Person;
int main() {
//創建棧
SeqStack* stack = Init_SeqStack();
//創建數據
Person p1 = {"aaa",18};
Person p2 = {"bbb",19};
Person p3 = {"ccc",20};
Person p4 = {"ddd",21};
Person p5 = {"eee",22};
//入棧
Push_SeqStack(stack,&p1);
Push_SeqStack(stack,&p2);
Push_SeqStack(stack,&p3);
Push_SeqStack(stack,&p4);
Push_SeqStack(stack,&p5);
//輸出
while (Size_SeqStack(stack) > 0) {
//出棧
Person* person = (Person *) Pop_SeqStack(stack);
printf("Name:%s Age:%d\n",person->name,person->age);
}
printf("%d\n",IsEmpty(stack));
FreeSpace_SeqStack(stack);
return 0;
}
3.4、輸出結果
Name:eee Age:22
Name:ddd Age:21
Name:ccc Age:20
Name:bbb Age:19
Name:aaa Age:18
1
Process finished with exit code 0
4、使用C++語言來實現順序棧
4.1、SeqStack.h文件中的內容
#ifndef XGP_STUDY_DEMO47_SEQSTACK_H
#define XGP_STUDY_DEMO47_SEQSTACK_H
//數組去模擬棧的順序存儲
#include <iostream>
using namespace std;
#define MAX_SIZE 1024
template <class T>
class SeqStack {
public:
T* data[MAX_SIZE];
int size;
//1,初始化棧
SeqStack* Init_SeqStack();
//2,入棧
void Push_SeqStack(T* data);
//3,返回棧頂元素
T* Top_SeqStack();
//4,出棧
T* Pop_SeqStack();
//5,判斷是否為空
bool IsEmpty();
//6,返回棧中元素的個數
int Size_SeqStack();
//7,銷毀
void FreeSpace_SeqStack();
//8,清空棧
void Clear_SeqStack();
};
#endif //XGP_STUDY_DEMO47_SEQSTACK_H
4.2、SeqStack.cpp文件中的內容
#include "SeqStack.h"
template<class T>
SeqStack<T> *SeqStack<T>::Init_SeqStack() {
for(int i = 0;i < MAX_SIZE;i++) {
this->data[i] = NULL;
}
this->size = 0;
return this;
}
template<class T>
void SeqStack<T>::Push_SeqStack(T *data) {
if(this == NULL) return;
if(data == NULL) return;
if(this->size == MAX_SIZE) return;
this->data[this->size] = data;
this->size++;
}
template<class T>
T *SeqStack<T>::Top_SeqStack() {
if(this == NULL) return NULL;
if(this->size == 0) return NULL;
return this->data[this->size - 1];
}
template<class T>
T *SeqStack<T>::Pop_SeqStack() {
if(this == NULL) return NULL;
if(this->size == 0) return NULL;
T* save = this->data[this->size - 1];
this->data[this->size - 1] = NULL;
this->size--;
return save;
}
template<class T>
bool SeqStack<T>::IsEmpty() {
if(this == NULL) return false;
if(this->size == 0) return true;
return false;
}
template<class T>
int SeqStack<T>::Size_SeqStack() {
if(this == NULL) return -1;
return this->size;
}
template<class T>
void SeqStack<T>::FreeSpace_SeqStack() {
if(this == NULL) return;
delete this;
}
template<class T>
void SeqStack<T>::Clear_SeqStack() {
if(this == NULL) return;
for(int i = 0;i < this->size;i++) {
this->data[i] = NULL;
}
this->size = 0;
}
4.3、main.cpp文件中的內容
#include "SeqStack.cpp"
class Person {
public:
string name;
int age;
Person(const string &name, int age) : name(name), age(age) {}
};
int main() {
//創建棧
SeqStack<Person>* stack = new SeqStack<Person>();
//創建數據
Person p1("aaa",18);
Person p2("bbb",19);
Person p3("ccc",20);
Person p4("ddd",21);
Person p5("eee",22);
//入棧
stack->Push_SeqStack(&p1);
stack->Push_SeqStack(&p2);
stack->Push_SeqStack(&p3);
stack->Push_SeqStack(&p4);
stack->Push_SeqStack(&p5);
//輸出
while (stack->Size_SeqStack() > 0) {
//出棧
Person* person = (Person *) stack->Pop_SeqStack();
cout<<"Name:"<<person->name<<"\t"<<"Age:"<<person->age<<endl;
}
cout<<stack->IsEmpty()<<endl;
stack->FreeSpace_SeqStack();
return 0;
}
4.4、輸出結果
Name:eee Age:22
Name:ddd Age:21
Name:ccc Age:20
Name:bbb Age:19
Name:aaa Age:18
1
Process finished with exit code 0
5、使用java語言來實現順序棧
5.1、SeqStack.java文件中的內容
package com.xgp.隊列的順序存儲;
public interface SeqStack<T> {
//1,初始化棧
void Init_SeqStack();
//2,入棧
void Push_SeqStack(T data);
//3,返回棧頂元素
T Top_SeqStack();
//4,出棧
T Pop_SeqStack();
//5,判斷是否為空
boolean IsEmpty();
//6,返回棧中元素的個數
int Size_SeqStack();
//7,銷毀
void FreeSpace_SeqStack();
//8,清空棧
void Clear_SeqStack();
}
5.2、SeqStackImpl.java文件中的內容
package com.xgp.隊列的順序存儲;
public class SeqStackImpl<T> implements SeqStack<T> {
public final static int MAX_SIZE = 1024;
public Object data[] = new Object[MAX_SIZE];
public int size;
@Override
public void Init_SeqStack() {
for(int i = 0;i < MAX_SIZE;i++) {
this.data[i] = null;
}
this.size = 0;
}
@Override
public void Push_SeqStack(T data) {
if(data == null) return;
if(this.size == MAX_SIZE) return;
this.data[this.size] = data;
this.size++;
}
@Override
public T Top_SeqStack() {
if(this.size == 0) return null;
return (T) this.data[this.size - 1];
}
@Override
public T Pop_SeqStack() {
if(this.size == 0) return null;
T save = (T) this.data[this.size - 1];
this.data[this.size - 1] = null;
this.size--;
return save;
}
@Override
public boolean IsEmpty() {
if(this.size == 0) return true;
return false;
}
@Override
public int Size_SeqStack() {
return this.size;
}
@Override
public void FreeSpace_SeqStack() {
Clear_SeqStack();
System.gc();
}
@Override
public void Clear_SeqStack() {
for(int i = 0;i < this.size;i++) {
this.data[i] = null;
}
this.size = 0;
}
}
5.3、Main.java文件中的內容
package com.xgp.隊列的順序存儲;
public class Main {
public static void main(String[] args) {
SeqStack<Person> stack = new SeqStackImpl<>();
stack.Init_SeqStack();
Person p1 = new Person("aaa",18);
Person p2 = new Person("bbb",19);
Person p3 = new Person("ccc",20);
Person p4 = new Person("ddd",21);
Person p5 = new Person("eee",22);
stack.Push_SeqStack(p1);
stack.Push_SeqStack(p2);
stack.Push_SeqStack(p3);
stack.Push_SeqStack(p4);
stack.Push_SeqStack(p5);
while (!stack.IsEmpty())
System.out.println(stack.Pop_SeqStack());
System.out.println(stack.IsEmpty());
stack.FreeSpace_SeqStack();
}
}
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
5.4、輸出結果
Person{name='eee', age=22}
Person{name='ddd', age=21}
Person{name='ccc', age=20}
Person{name='bbb', age=19}
Person{name='aaa', age=18}
true
進程完成,退出碼 0
6、使用JavaScript語言來實現順序棧
6.1、SeqStack.js文件中的內容
class SeqStack {
Init_SeqStack() {
this.MAX_SIZE = 1024;
this.data = [];
for(var i = 0;i < this.MAX_SIZE;i++) {
this.data[i] = null;
}
this.size = 0;
}
Push_SeqStack(data) {
if(this == null) return;
if(data == null) return;
if(this.size == this.MAX_SIZE) return;
this.data[this.size] = data;
this.size++;
}
Top_SeqStack() {
if(this == null) return null;
if(this.size == 0) return null;
return this.data[this.size - 1];
}
Pop_SeqStack() {
if(this == null) return -1;
if(this.size == 0) return null;
var save = this.data[this.size - 1];
this.data[this.size - 1] = null;
this.size--;
return save;
}
IsEmpty() {
if(this == null) return true;
if(this.size == 0) return true;
return false;
}
Size_SeqStack() {
if(this == null) -1;
return this.size;
}
FreeSpace_SeqStack() {
if(this == null) return;
this.Clear_SeqStack();
}
Clear_SeqStack() {
if(this == null) return;
for(var i = 0;i < this.size;i++) {
this.data[i] = null;
}
this.size = 0;
}
}
6.2、SeqStack.html文件中的內容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="SeqStack.js"></script>
</head>
<body>
<script>
class Person {
constructor(name,age) {
this.name = name;
this.age = age;
}
print() {
console.log("Name:" + this.name + "\t" + "Age:" + this.age);
}
}
var stack = new SeqStack();
stack.Init_SeqStack();
var p1 = new Person("aaa",18);
var p2 = new Person("bbb",19);
var p3 = new Person("ccc",20);
var p4 = new Person("ddd",21);
var p5 = new Person("eee",22);
stack.Push_SeqStack(p1);
stack.Push_SeqStack(p2);
stack.Push_SeqStack(p3);
stack.Push_SeqStack(p4);
stack.Push_SeqStack(p5);
while (!stack.IsEmpty())
stack.Pop_SeqStack().print();
console.log(stack.IsEmpty());
stack.FreeSpace_SeqStack();
</script>
</body>
</html>
6.3、輸出結果
Name:eee Age:22 SeqStack.html:18:25
Name:ddd Age:21 SeqStack.html:18:25
Name:ccc Age:20 SeqStack.html:18:25
Name:bbb Age:19 SeqStack.html:18:25
Name:aaa Age:18 SeqStack.html:18:25
true SeqStack.html:40:17
7、使用Python語言來實現順序棧
7.1、SeqStack.py文件中的內容
class SeqStack:
def Init_SeqStack(self):
self.MAX_SIZE = 1024
self.data = [None]*self.MAX_SIZE
self.size = 0
def Push_SeqStack(self,data):
if(self is None):
return
if(data is None):
return
if(self.size == self.MAX_SIZE):
return
self.data[self.size] = data
self.size += 1
def Top_SeqStack(self):
if(self is None):
return None
if(self.size == 0):
return None
return self.data[self.size - 1]
def Pop_SeqStack(self):
if(self is None):
return -1
if(self.size == 0):
return None
save = self.data[self.size -1]
self.data[self.size - 1] = None
self.size -= 1
return save
def IsEmpty(self):
if(self == None):
return True
if(self.size == 0):
return True
return False
def Size_SeqStack(self):
if(self is None):
return -1
return self.size
def FreeSpace_SeqStack(self):
if(self is None):
return
self.Clear_SeqStack()
def Clear_SeqStack(self):
if(self is None):
return
for i in range(0,self.size):
self.data[i] = None
self.size = 0
7.2、main.py文件中的內容
from SeqStack import *
class Person:
def __init__(self,name,age) -> None:
self.name = name
self.age = age
def __str__(self) -> str:
return "Name:" + self.name + "\t" + "Age:" + str(self.age)
stack = SeqStack()
stack.Init_SeqStack()
p1 = Person("aaa", 18)
p2 = Person("bbb", 19)
p3 = Person("ccc", 20)
p4 = Person("ddd", 21)
p5 = Person("eee", 22)
stack.Push_SeqStack(p1)
stack.Push_SeqStack(p2)
stack.Push_SeqStack(p3)
stack.Push_SeqStack(p4)
stack.Push_SeqStack(p5)
while(stack.IsEmpty() == False):
print(stack.Pop_SeqStack())
print(stack.IsEmpty())
stack.FreeSpace_SeqStack()
7.3、輸出結果
Name:eee Age:22
Name:ddd Age:21
Name:ccc Age:20
Name:bbb Age:19
Name:aaa Age:18
True