1.栈
#include<iostream>
#include <cstdio>
using namespace std;
typedef int SElemType;
typedef int Status;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
int main()
{
int e;
SqStack S;
Status InitStack(SqStack &S);
Status DestroyStack(SqStack &S);
Status ClearStack(SqStack &S);
Status StackEmpty(SqStack S);
int StackLength(SqStack S);
Status GetTop(SqStack S,SElemType &e);
Status Push(SqStack &S,SElemType e);
Status Pop(SqStack &S,SElemType &e);
Status visit(SElemType e);
Status StackTraverse(SqStack S,Status (*visit)(SElemType e));
InitStack(S);
for(int i=0;i<10;i++)Push(S,i);
cout<<StackLength(S)<<endl;
GetTop(S,e);
cout<<e<<endl;
for(int j=0;j<5;j++)
{
Pop(S,e);
cout<<e<<' ';
}
cout<<endl;
StackTraverse(S,visit);
cout<<endl;
ClearStack(S);
if(StackEmpty(S))cout<<"S is empty."<<endl;
DestroyStack(S);
return 0;
}
Status InitStack(SqStack &S)
{
S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)return 0;
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return 1;
}
Status DestroyStack(SqStack &S)
{
free(S.base);
return 1;
}
Status ClearStack(SqStack &S)
{
S.top=S.base;
return 1;
}
Status StackEmpty(SqStack S)
{
if(S.top==S.base)return 1;
else return 0;
}
int StackLength(SqStack S)
{
return S.top-S.base;
}
Status GetTop(SqStack S,SElemType &e)
{
if(S.top==S.base)return 0;
e=*(S.top-1);
return 1;
}
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)return 0;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
Status Pop(SqStack &S,SElemType &e)
{
if(S.top==S.base)return 0;
e=*--S.top;
return 1;
}
Status visit(SElemType e)
{
cout<<e<<' ';
return 1;
}
Status StackTraverse(SqStack S,Status (*visit)(SElemType e))
{
if(S.top==S.base)return 0;
while(S.base<S.top)visit(*S.base++);
return 1;
}
2.栈的应用举例
2.1数制转换
#include<iostream>
#include <cstdio>
using namespace std;
typedef int SElemType;
typedef int Status;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
int main()
{
int N;
Status InitStack(SqStack &S);
Status StackEmpty(SqStack S);
Status DestroyStack(SqStack &S);
Status Push(SqStack &S,SElemType e);
Status Pop(SqStack &S,SElemType &e);
void Conversion(int N);
cin>>N;
Conversion(N);
return 0;
}
Status InitStack(SqStack &S)
{
S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)return 0;
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return 1;
}
Status DestroyStack(SqStack &S)
{
if(S.top==S.base)return 0;
free(S.base);
return 1;
}
Status StackEmpty(SqStack S)
{
if(S.top==S.base)return 1;
else return 0;
}
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)return 0;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
Status Pop(SqStack &S,SElemType &e)
{
if(S.top==S.base)return 0;
e=*--S.top;
return 1;
}
void Conversion(int N)
{
int e;
SqStack S;
InitStack(S);
while(N)
{
Push(S,N%8);
N/=8;
}
while(!StackEmpty(S))
{
Pop(S,e);
cout<<e;
}
cout<<endl;
DestroyStack(S);
}
2.2括号匹配的检验
#include<iostream>
#include<string>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
typedef char SElemType;
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S)
{
S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)return ERROR;
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)return ERROR;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
Status Pop(SqStack &S,SElemType &e)
{
if(S.top==S.base)return ERROR;
e=*--S.top;
return OK;
}
Status MatchCheck(string s)
{
SqStack st;
InitStack(st);
for(int i=0;i<s.length();i++)
{
if(s[i]=='('||s[i]=='[')Push(st,s[i]);
else if(s[i]==')')
{
char e;
Pop(st,e);
if(e!='(')return FALSE;
}
else
{
char e;
Pop(st,e);
if(e!='[')return FALSE;
}
}
if(st.top=st.base)return TRUE;
else return FALSE;
}
int main()
{
string s;
cin>>s;
if(MatchCheck(s))cout<<"匹配";
else cout<<"不匹配";
return 0;
}
#include<iostream>
#include<string>
#include<stack>
using namespace std;
bool isValid(string s)
{
stack<char> st;
for(int i=0;i<s.size();++i)
{
if(s[i]=='('||s[i]=='['||s[i]=='{')st.push(s[i]);
else if(st.empty())return false;
else if(s[i]==')')
{
if(st.top()=='(')st.pop();
else return false;
}
else if(s[i]==']')
{
if(st.top()=='[')st.pop();
else return false;
}
else
{
if(st.top()=='{')st.pop();
else return false;
}
}
return true;
}
int main()
{
string s="()";
cout<<isValid(s)<<endl;
return 0;
}