C/C++ Stack: 以Array與Linked list實作
C/C++ Stack: 以Array與Linked list實作
資料來源: http://alrightchiu.github.io/SecondRound/stack-introjian-jie.html
http://alrightchiu.github.io/SecondRound/stack-yi-arrayyu-linked-listshi-zuo.html
https://openhome.cc/Gossip/AlgorithmGossip/StackByLink.htm
一般的Stack,會有以下幾個處理資料結構的功能:
1.Push(data):把資料放進Stack。
2.Pop:把「最上面」的資料從Stack中移除。
3.Top:回傳「最上面」的資料,不影響資料結構本身。
4.IsEmpty:確認Stack裡是否有資料,不影響資料結構本身。
5.getSize:回傳Stack裡的資料個數,不影響資料結構本身。
使用鏈結實作(C 語言動態記憶體宣告)
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node *next;
};
typedef struct node Node;
Node* creates(void); // 建立堆疊
int isEmpty(Node*); // 堆疊已空
int stacktop(Node*); // 傳回頂端元素
Node* add(Node*, int); // 新增元素
Node* delete(Node*); // 刪除元素
void list(Node*); // 顯示所有內容
int main(void) {
Node* sTop;
int input, select;
sTop = creates();
while(1) {
printf("\n\n請輸入選項(-1結束):");
printf("\n(1)插入值至堆疊");
printf("\n(2)顯示堆疊頂端");
printf("\n(3)刪除頂端值");
printf("\n(4)顯示所有內容");
printf("\n\$c>");
scanf("%d", &select);
if(select == -1)
break;
switch(select) {
case 1:
printf("\n輸入值:");
scanf("%d", &input);
sTop = add(sTop, input);
break;
case 2:
printf("\n頂端值:%d", stacktop(sTop));
break;
case 3:
sTop = delete(sTop);
break;
case 4:
list(sTop);
break;
default:
printf("\n選項錯誤!");
}
}
printf("\n");
return 0;
}
Node* creates() {
return NULL;
}
int isEmpty(Node* top) {
return (top == NULL);
}
int stacktop(Node* top) {
return top->data;
}
Node* add(Node* top, int item) {
Node* newnode;
newnode = (Node*) malloc(sizeof(Node));
if(newnode == NULL) {
printf("\n記憶體配置失敗!");
exit(1);
}
newnode->data = item;
newnode->next = top;
top = newnode;
return top;
}
Node* delete(Node* top) {
Node* tmpnode;
tmpnode = top;
if(tmpnode == NULL) {
printf("\n堆疊已空!");
return NULL;
}
top = top->next;
free(tmpnode);
return top;
}
void list(Node* top) {
getnode* tmpnode;
tmpnode = top;
printf("\n堆疊內容:");
while(tmpnode != NULL) {
printf("%d ", tmpnode->data);
tmpnode = tmpnode->next;
}
}
C++以Array實作Stack
// C++ code
#include <iostream>
class StackArray{
private:
int top; // index of top element
int capacity; // allocated memory space of array
int *stack; // array representing stack
void DoubleCapacity(); // double the capacity of stack
public:
StackArray():top(-1),capacity(1){ // constructor
stack = new int[capacity]; // initial state: top=-1, capacity=1
}
void Push(int x);
void Pop();
bool IsEmpty();
int Top();
int getSize();
};
void StackArray::DoubleCapacity(){
capacity *= 2; // double capacity
int *newStack = new int[capacity]; // create newStack
for (int i = 0 ; i < capacity/2; i++) { // copy element to newStack
newStack[i] = stack[i];
}
delete [] stack; // release the memory of stack
stack = newStack; // redirect stack to newStack
}
void StackArray::Push(int x){
if (top == capacity - 1) { // if stack is full, double the capacity
DoubleCapacity();
}
stack[++top] = x; // update top and put x into stack
}
void StackArray::Pop(){
if (IsEmpty()) { // if stack is empty, there is nothing to pop
std::cout << "Stack is empty.\n";
return;
}
top--; // update top
// stack[top] = 0; // (*1)
// stack[top].~T(); // (*2)
}
bool StackArray::IsEmpty(){
// if (top == -1) {
// return true;
// }
// else {
// return false;
// }
return (top == -1);
}
int StackArray::Top(){
if (IsEmpty()) { // check if stack is empty
std::cout << "Stack is empty.\n";
return -1;
}
return stack[top]; // return the top element
}
int StackArray::getSize(){
return top+1; // return the number of elements in stack
}
int main(){
StackArray s;
s.Pop();
s.Push(14);
s.Push(9);
std::cout << "\ntop: " << s.Top() << "\nsize: " << s.getSize() << std::endl;
s.Push(7);
std::cout << "\ntop: " << s.Top() << "\nsize: " << s.getSize() << std::endl;
s.Pop();
s.Pop();
std::cout << "\ntop: " << s.Top() << "\nsize: " << s.getSize() << std::endl;
s.Pop();
std::cout << "\ntop: " << s.Top() << "\nsize: " << s.getSize() << std::endl;
return 0;
}
C++以Linked list實作Stack
// C++ code
#include <iostream>
class StackList;
class StackNode{
private:
int data;
StackNode *next;
public:
StackNode():data(0){
next = 0;
}
StackNode(int x):data(x){
next = 0;
}
StackNode(int x, StackNode *nextNode):data(x),next(nextNode){};
friend class StackList;
};
class StackList{
private:
StackNode *top; // remember the address of top element
int size; // number of elements in Stack
public:
StackList():size(0),top(0){};
void Push(int x);
void Pop();
bool IsEmpty();
int Top();
int getSize();
};
void StackList::Push(int x){
if (IsEmpty()) {
top = new StackNode(x);
size++;
return;
}
StackNode *newnode = new StackNode(x); // Push_front() in Linked list
newnode->next = top;
// StackNode *newnode = new StackNode(x,top);
top = newnode;
size++;
}
void StackList::Pop(){
if (IsEmpty()) {
std::cout << "Stack is empty.\n";
return;
}
StackNode *deletenode = top;
top = top->next;
delete deletenode;
deletenode = 0;
size--;
}
bool StackList::IsEmpty(){
return (size == 0); // if size==0, return true
}
int StackList::Top(){
if (IsEmpty()) {
std::cout << "Stack is empty.\n";
return -1;
}
return top->data;
}
int StackList::getSize(){
return size;
}
int main(){
StackList s;
s.Pop();
s.Push(32);
s.Push(4);
std::cout << "\ntop: " << s.Top() << "\nsize: " << s.getSize() << std::endl;
s.Push(15);
std::cout << "\ntop: " << s.Top() << "\nsize: " << s.getSize() << std::endl;
s.Pop();
s.Pop();
std::cout << "\ntop: " << s.Top() << "\nsize: " << s.getSize() << std::endl;
s.Pop();
std::cout << "\ntop: " << s.Top() << "\nsize: " << s.getSize() << std::endl;
return 0;
}
One thought on “C/C++ Stack: 以Array與Linked list實作”
C/C++ STACK: 以ARRAY與LINKED LIST實作 先進後出