栈和队列

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; 
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值