Introduction of Stack
栈是一种数据结构,属于抽象数据结构(ADT),遵循Last-In-First-Out(LIFO)原则。
基本操作:
1)Push(x)–在栈中插入x
2)Pop()–移除最近插入的元素
3)Top()–返回栈顶的元素
4)Empty()–判断栈是否为空
以上几个操作的时间复杂度均为O(1)。
栈的应用:
–Function calls/recursion
–Undo in an editor
–Balance Parentheses
Implementation of Stack
I. Array implementation
int A[10];
int top = -1;//global
void Push(int x){
top = top + 1;
A[top] = x;
}
void Pop(){
top = top-1;
}
int Top(){
return A[top];
}
bool IsEmpty(){
if(top ==-1)
return true;
else
return false;
}
II. Linked list implementation
如果Push在链表的末尾,那么每次操作的时间复杂度为O(n),不符合栈的O(1)operation。所以每次Push都将新元素插入链表的头部。
struct Node{
int data;
struct Node* link;
}
struct Node* top = NULL;
void Push(int x){
struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
temp->data = x;
temp->link = top;
top = temp;
}
void Pop(){
struct Node* temp;
if(top == NULL)
return;
temp = top;
top = top->link;
free(temp);
}
Using stack to reverse
I. Reverse a string
调用C++中自带的stack库函数,能够直接定义一个栈,并且直接调用以上几种操作。
调用语法为:头文件–<stack>,语法 stack <变量数据类型> 栈名称;name.option()为操作
代码
#include<iostream>
#include<stack>
using namespace std;
void Reverse(char *C,int n){
stack<char> S;
for(int i=0;i<n;i++){
S.push(C[i]);
}
for(int i=0;i<n;i++){
C[i] = S.top();
S.pop();
}
}
int main(){
char C[51];
printf("Enter a string\n");
gets(C);
Reverse(C,strlen(C));
printf("Output: %s",C);
return 0;
}
输入/出结果
Enter a string
hello!
Output: !olleh
II. Reverse linked list
代码
#include<iostream>
#include<stack>
using namespace std;
struct Node{
int data;
struct Node* link;
};
struct Node* head;
void Reverse(){
stack<struct Node*> S;
Node* temp = head;
while(temp != NULL){
S.push(temp);
temp = temp->link;
}
temp = S.top();
head = temp;
S.pop();
while(!S.empty()){
temp->link = S.top();
S.pop();
temp = temp->link;
}
temp->link = NULL;
}
void InsertAtHead(int x){
struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
temp->data = x;
temp->link = head;
head = temp;
}
void Print(){
struct Node* temp = head;
while(temp->link != NULL){
printf("%d ",temp->data);
temp = temp->link;
}
printf("\n");
}
int main(){
head = NULL;
InsertAtHead(5);
InsertAtHead(4);
InsertAtHead(3);
InsertAtHead(2);
InsertAtHead(1);
printf("Input: ");
Print();
Reverse();
printf("Output: ");
Print();
return 0;
}
输出结果
Input: 1 2 3 4 5
Output: 5 4 3 2 1