一、栈的几个基本操作
栈是一种特殊的线性表,特点是后进先出
Stack createStack() : 创建一个空栈
bool isEmpty() : 判断栈是否为空
void pushStack():入栈
void popStack() : 出栈
Datatype getTop() : 取栈顶元素
二、顺序表示
用顺序的方式表示栈时,需要分配一块连续的存储空间来存放栈中元素,用一个变量来表示栈顶位置。
存储结构
typedef char type;
typedef struct Stack{
int Maxnum; //栈元素最大值
int top; // 栈顶
type* data;
}Seqstack;
创建一个空栈(这里用-1来表示栈顶)
Seqstack* createStack(){
Seqstack* stack =(Seqstack*)malloc(sizeof(Seqstack));
stack->top = -1;
stack->Maxnum = Max;
stack->data =(type*)malloc(sizeof(type)*stack->Maxnum);
return stack;
}
判断是否为空
bool isEmpty(Seqstack* stack){
if(stack->top == -1)
return true;
else
return false;
}
入栈操作
void pushV(Seqstack* stack,type value){
if(stack->top == stack->Maxnum-1)
cout<<"Overflow!"<<endl;
else{
stack->data[++stack->top] = value;
}
}
出栈
void popV(Seqstack* stack){
if(stack->top == -1)
cout<<"Underflow!"<<endl;
else{
stack->top--;
}
}
取栈顶元素
type getTop(Seqstack* stack){
if(stack->top == -1)
cout<<"the stack is empty!"<<endl;
else
return stack->data[stack->top];
}
三、链式表示
存储结构,这里为了强调栈顶是栈的属性,所以对栈增加了一层封装
typedef char type;
typedef struct Node{
type data;
struct Node* next;
}Node;
typedef struct LinkStack{
Node* top; //表示栈顶
}LinkStack;
创建空栈
LinkStack* createStack(){ //可以理解为多用一块存储空间来存放栈顶这个指针
LinkStack* pstack = new LinkStack;
if(pstack!=NULL)
pstack->top = NULL;
else
cout<<"out of space!"<<endl;
return pstack;
}
判断是否为空
bool isEmpty(LinkStack* stack){
if(stack->top == NULL)
return true;
else
return false;
}
入栈
void pushV(LinkStack* stack,type value){
Node* temp = new Node;
if(temp == NULL)
cout<<"out of space!"<<endl;
else{
temp->data = value;
temp->next=stack->top;
stack->top = temp;
}
}
出栈
void popV(LinkStack* stack){
Node* p;
if(isEmpty(stack))
cout<<"Empty stack!"<<endl;
else{
p = stack->top;
stack->top = stack->top->next;
free(p);
}
}
取栈顶元素
type getTop(LinkStack* stack)
{
if(isEmpty(stack))
cout<<"Empty stack!"<<endl;
else{
return stack->top->data;
}
}
四、括号的匹配
这里进行一个简单的’[‘和’('两种括号的简单匹配,(采用顺序表示法)来验证栈的基本操作是否正确;进行括号的匹配算法如下:
1.创建空栈,顺序读入括号,左括号执行进栈操作;
2.若是右括号,则取栈顶,判断栈顶元素是否为左括号。如果是左括号,则匹配成功,进行出栈操作;反之,匹配失败。
3.读取结束,栈为空,则为成功匹配;反之不匹配。
在这里int main(void){
Seqstack* stack = createStack();
string str;
stack->data[++stack->top] = '#';
cout<<"enter the string(include [] and ()"<<endl;
cin>>str;
for(int i=0;i<str.length();i++){
if(str[i] == '[' || str[i] == '(')
pushV(stack,str[i]);
else{
if(stack->data[stack->top] == '#')
{
cout<<"don't match!"<<endl;
return 0;
}
else if(str[i] == ')' && stack->data[stack->top] == '(')
{
popV(stack);
}
else if(str[i] == ']' && stack->data[stack->top] == '[')
{
popV(stack);
}
else
{
cout<<"lack of [ or ("<<endl;
break;
}
}
}
if(stack->data[stack->top] == '#')
cout<<"match success!"<<endl;
else
cout<<"don't match!"<<endl;
return 0;
}
五、不使用递归调用计算阶乘
算法思想:把阶层数减一后入栈,直到阶层数减到零;然后再依次出栈进行乘法运算;根据栈先进后出的特点,可以得到结果。
int main(void){
Seqstack* stack = createStack();
int value,res;
cout<<"enter the value:"<<endl;
cin>>value;
while(value>0)
pushV(stack,value--);
res = 1;
while(!isEmpty(stack))
{
res = res*getTop(stack);
popV(stack);
}
cout<<"the result is :"<<res<<endl;
return 0;
}