您的位置:首页 > 其它

顺序栈(进制转换 + 括号匹配 + 判断栈表 + 最长括号匹配长度)

2015-11-28 12:37 507 查看
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW   -2

#define STACK_INIT_SIZE 100
#define STACKLINCREMENT 10
typedef int Status;
typedef int SElemType;

typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;

Status InitStack(SqStack &S){
//构造一个空栈S
S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}

Status Empty(SqStack S){
//判断栈是否为空
if( S.base == S.top)
return OK;
return FALSE;
}

Status GetTop(SqStack S){
//若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR
int e;
if(S.top == S.base) return ERROR;
e = *(S.top - 1);
return e;
}

Status Push(SqStack &S,SElemType e){
//插入元素e为新的栈顶元素
if(S.top - S.base >= S.stacksize){
//栈满
S.base = (SElemType *) realloc(S.base,(S.stacksize + STACKLINCREMENT) * sizeof(SElemType));

if(!S.base) exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKLINCREMENT;
}

*S.top++ = e;
return OK;
}

int StackLength(SqStack S){
//返回栈的长度
return (S.top - S.base);

}
Status Pop(SqStack &S,SElemType &e){
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回KO,否则返回ERROR
if(S.top == S.base) return ERROR;

e = *--S.top;
return OK;
}

void StackTraverse(SqStack S){
while(S.top > S.base){
printf("%d\n",*S.base++);
}
printf("\n");
}

//进制转换
int main()
{
int m,k,e;
while(cin>>m>>k)
{
if(m<0) {m=-m;cout<<'-';}
SqStack S;
InitStack(S);
while(m!=0)
{
Push(S,m%k);
m=m/k;
}
while(!Empty(S))
{

if(GetTop(S)==10) cout<<'A';
else if(GetTop(S)==11) cout<<'B';
else if(GetTop(S)==12) cout<<'C';
else if(GetTop(S)==13) cout<<'D';
else if(GetTop(S)==14) cout<<'E';
else if(GetTop(S)==15) cout<<'F';

else cout<<GetTop(S);
Pop(S,e);
}
cout<<endl;
}
return 0;
}

//括号匹配
int main()
{
int e;
char c[100];
while(cin.getline(c,100))
{
//stack<char>st;
SqStack S;
InitStack(S);
int d = 1;
int len =strlen(c);
for(int i = 0; i < len; i++)
{
if(c[i]=='('||c[i]=='{'||c[i]=='[')
Push(S,c[i]);
else if(c[i]==')'&&!Empty(S)&&GetTop(S)=='(')
Pop(S,e);
else if(c[i]==')'&&!Empty(S)&&GetTop(S)!='(')
d=0;
else if(c[i]==')'&&Empty(S))
d=0;
else if(c[i]==']'&&!Empty(S)&&GetTop(S)=='[')
Pop(S,e);
else if(c[i]==']'&&!Empty(S)&&GetTop(S)!='[')
d=0;
else if(c[i]==']'&&Empty(S))
d=0;
else if(c[i]=='}'&&!Empty(S)&&GetTop(S)=='{')
Pop(S,e);
else if(c[i]=='}'&&!Empty(S)&&GetTop(S)!='{')
d=0;
else if(c[i]=='}'&&Empty(S))
d=0;

}
if(!Empty(S)||d == 0) cout<<"no"<<endl;
else cout<<"yes"<<endl;
}
return 0;
}

//判断栈表
int main()
{
int n,e,target[100];
while(scanf("%d", &n) == 1)
{
SqStack S;
InitStack(S);
int A = 1, B = 1;
for(int i = 1; i <= n; i++)
{
scanf("%d",&target[i]);
}
int ok = 1;
while(B <= n)
{
if(A == target[B])
{
A++, B++;
}
else if(!Empty(S) && GetTop(S) == target[B])
{
Pop(S,e);
B++;
}
else if(A <= n) Push(S,A++);
else
{
ok = 0;
break;
}
}
printf("%s\n",ok ? "Yes" : "No");
}
return 0;
}

//最长括号匹配长度
int main()
{
char st[1000000];
int t,e;
while(cin>>t)
{
while(t--)
{
cin>>st;
int len=strlen(st);
SqStack S;
InitStack(S);
for(int i = 0;i < len;i++)
{
if(st[i]=='(') Push(S,st[i]);
else if(st[i]==')'&& !Empty(S)&&GetTop(S)=='(') Pop(S,e);
else if(st[i]==')') Push(S,st[i]);
}
cout<<len - StackLength(S)<<endl;
}
}
return 0;
}


链栈:

typedef SElemType ElemType;
typedef LinkList LinkStack;

#define InitStack InitList
#define DestroyStack DestroyList
#define ClearStack ClearList
#define StackEmpty ListEmpty
#define StackLength ListLength

Status GetTop(LinkStack S,SElemType e)
{
return GetElem(S,1,e);
}

Status Push(LinkStack &S,SElemType e)
{
return ListInsert(S,1,e);
}

Status Pop(LinkStack &S,SElemType &e)
{
return ListDelete(S,1,e);
}

void StackTraverse(LinkStack S)
{
LinkStack temp,p = S;
InitStack(temp);
while(p)
{
Push(temp,p->data);
p = p->next;
}
ListTraverse(temp);
}

int main()
{
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: