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

#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;
}
时间: 2024-12-25 10:18:06

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

浅谈栈&amp;&amp;进制转换

利用stack实现进制转换 Stack.h #ifndef _STACK_H_ #define _STACK_H_ #include<iostream> #include<assert.h> using namespace std; typedef int ElemType; #define STACK_MAX_SIZE 100 #define HEX 2 typedef struct Stack { ElemType *base;//栈底指针 int top; //栈顶标识 in

PAT 甲级 1015 Reversible Primes (20 分) (进制转换和素数判断(错因为忘了=))

1015 Reversible Primes (20 分) A reversible prime in any number system is a prime whose "reverse" in that number system is also a prime. For example in the decimal system 73 is a reversible prime because its reverse 37 is also a prime. Now given

ex5.“栈”+进制转换算法

#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #include<stdio.h> #include<stdlib.h> typedef int SElemType; typedef struct{ SElemType *base,*top; int stacksize; }SqStack; int InitStack(SqStack &S) { S.base = (SElemType*)malloc(sizeof

用栈实现进制转换

“除基取余 + 顺序栈”  实现十进制数转换成其他进制数,代码如下: #include <stdio.h>#define MAX_L 100 //定义栈typedef struct {    int data[MAX_L];            int top;            }Stack; //进制转换//origin是待转数,right是要转的目的数的权void Convert(int origin, int right)  {    Stack s;        //初始化栈

数据结构实验之栈一:进制转换(栈的应用)

 数据结构实验之栈一:进制转换 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 输入一个十进制整数,将其转换成对应的R(2<=R<=9)进制数,并输出. 输入 第一行输入需要转换的十进制数: 第二行输入R. 输出 输出转换所得的R进制数. 示例输入 1279 8 示例输出 2377 提示 来源 示例程序 后台数据太水,按理说应该考虑零的情况,但是你不判断零也是对的. #include <stdio.h> #i

c语言之进制转换(栈实现)

从上两篇博客中我们可以知道,栈具有后进先出的特性,而进制转换的打印输出刚好与计算过程相反,满足栈这后进先出的特性, 所以可以用栈很快的实现进制转换,下面是用栈实现进制转换的c函数 void conversion (SqStack *pstack,unsigned int N, const unsigned int d){ if( pstack == NULL)//当传入参数为指针,必须判空 exit(-1); int mod ;//保存mod = N %d while( N != 0){ mod

数据结构实验之栈:进制转换

            数据结构实验之栈:进制转换 输入一个十进制整数,将其转换成对应的R(2<=R<=9)进制数,并输出. 输入 第一行输入需要转换的十进制数:第二行输入R. 输出 输出转换所得的R进制数. 模板: while(n!=0) { mod = n%r; q[i++] = mod;//i初始化为0 n/=r; }  

利用栈实现进制转换

#include<stdio.h>#include<malloc.h> #define MAX_STACK_SIZE 10//静态栈向量大小 #define ERROR 0#define OK 1 typedef int ElemType;typedef int Status;/栈的应用:进制转换/typedef struct sqstack{ElemType stack_array[MAX_STACK_SIZE];// int size;int top;int bottom;}S

hdu 2031 进制转换(栈思想的使用)

进制转换 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 63039    Accepted Submission(s): 34261 Problem Description 输入一个十进制数N,将它转换成R进制数输出. Input 输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<&