栈的操作

学习了数据结构之的顺序表与链表之后,再去接触栈的操作,觉得简单多了。自己就想用栈来实现下实际功能。但是遇到了麻烦(对于初学者来说),不管结果怎样,这都是一次成长的过程,虽然现在问题没有解决,但是我先把他以微博的形式记录下来,以遍我在以后能解决它。

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include"string.h"
typedef char NoteType;
//#include"LinkStack.h"
int Match(NoteType e,NoteType ch);
typedef struct
{
    NoteType ch[50];
    int top;
}LinkStack;
void PushStack(LinkStack s,NoteType e)
{
    if(s.top<50)
    {
        s.ch[s.top]=e;
        s.top++;
    }
    else
    return ;
}
void  PopStack(LinkStack s,NoteType *e)
{
    if(s.top!=0)
    {    *e=s.ch[s.top];
        s.top--;
    }
    else
    return ;
}
int StackEmpty(LinkStack s)
{
    if(s.top==0)
        return 1;
    else
        return 0;
}
NoteType GetTop(LinkStack s,NoteType *e)
{
    *e=s.ch[s.top];
    return *e;
}
 main()
{
    LinkStack s;
    NoteType ch[50];
    char *p;
    NoteType e;
    printf("输入括号:((),{},[])\n");
    gets(ch);
    p=ch;
    while(*p)
    {
        switch(*p)
        {
            case‘(‘:
            case‘[‘:
            case‘{‘:
                PushStack(s,*p);

                break;
            case‘)‘:
            case‘]‘:
            case‘}‘:
                if(StackEmpty(s))
                {
                    printf("在第个括号前缺少左括号。\n");
                    return 0;
                }
                else
                {
                    GetTop(s,&e);
                    if(Match(e,*p))
                    {
                        PopStack(s,&e);
                    }
                    else
                    {
                        printf("左右括号不匹配。n");
                        return 0;
                    }
                }
            default:
                p++;
        }

    }
    if(StackEmpty(s))
    {
        printf("已匹配。\n");
    }
    else
    {
        printf("第个括号没有右括号\n");
    }
}
int Match(NoteType e,NoteType ch)
{
    if(e==‘(‘&&ch==‘)‘)
        return 1;
    else if(e==‘[‘&&ch==‘]‘)
        return 1;
    else if(e==‘{‘&&ch==‘}‘)
        return 1;
    else
        return 0;
}

懂得大神可以帮我看看,我属于这方面的小白。

时间: 2024-08-02 19:00:05

栈的操作的相关文章

对栈的操作和算法实现

一.栈的定义 从数据结构角度看,栈也是线性表,其特殊性在于栈的基本操作都是线性操作的子集,它是操作受限的线性表. 栈(stack)是限定仅在表尾进行插入或删除操作的线性表. 栈一般分为两种: 静态栈:用数组实现: 动态栈:用链表实现. 一般用的比较多的都是动态栈.如果学会了链表,其实对栈的操作就比较简单了. 二.栈的结构 空栈的结构:(其实就是栈顶和栈顶都指向一个不存放有效数据的头结点) 存有结点的栈结构:(栈顶指针指向栈顶结点,栈底指针指向头结点) 三.用C语言实现 /* 2016年9月17日

洛谷P1573 栈的操作 [2017年6月计划 数论11]

P1573 栈的操作 题目描述 现在有四个栈,其中前三个为空,第四个栈从栈顶到栈底分别为1,2,3,…,n.每一个栈只支持一种操作:弹出并 压入.它指的是把其中一个栈A的栈顶元素x弹出,并马上压入任意一个栈B中.但是这样的操作必须符合一定的规则才能进行.规则1:A栈不能为空.规则 2:B栈为空或x比B栈栈顶要小. 对于给定的n,请你求出把第四个栈的n个元素全部移到第一个栈的最少操作次数. 由于最少操作次数可能很多,请你把答案对1000007取模. 输入输出格式 输入格式: 一行,一个n 输出格式

HDU 5818 Joint Stacks ——(栈的操作模拟,优先队列)

题意:有两个栈A和B,有3种操作:push,pop,merge.前两种都是栈的操作,最后一种表示的是如果“merge A B”,那么把B中的元素全部放到A中,且满足先入后出的栈原则. 分析:显然,我们给每一个节点配备一个时间戳即可.我一开始的思路是直接开两个优先队列进行直接模拟,merge操作就是把一个栈的元素全部倾倒到另一个栈内,但是会出现的问题是,如果有一个状态A和B的元素都相当多了,并且反复的进行merge操作,那么每一次merge都意味着大量的元素进出,肯定会超时的.因此,我们需要优化,

栈和队列----用递归函数和栈的操作实现逆序一个栈

用递归函数和栈的操作实现逆序一个栈 一个栈依次压入1.2.3.4.5,那么从栈顶到栈底分别为5.4.3.2.1,将这个栈转置后,从栈顶到栈底为1.2.3.4.5,也就是实现栈中元素的逆序,但是只能使用递归函数来实现,不能实现其他数据结构. package com.test; import java.util.Stack; /** * Created by Demrystv. */ public class ReverseStack { //将栈stack的栈底元素返回并且删除 private s

顺序栈的操作,整数进栈,取栈顶元素,栈内剩余元素

// main.cpp //  stack_quhao //  Created by duanqibo on 2019/6/29. //  Copyright © 2019年 duanqibo. All rights reserved. //  顺序栈的操作,整数进栈,取栈顶元素,栈内剩余元素 #include <iostream> #include <stdio.h> #include <stdlib.h> const int maxsize=6; /* typede

H5中对history栈的操作

今天研究一下H5中history操作的相关知识,首先梳理一下基本内容: 一.在history中的跳转 使用 back(), forward()和 go() 方法来完成在用户历史记录中向后和向前的跳转. window.history.back(); window.history.forward(); window.history.go(-1); window.history.go(1); 可以通过查看长度属性的值来确定的历史堆栈中页面的数量: let numberOfEntries = windo

Stack操作,栈的操作。

栈是先进后出,后进先出的操作. 有点类似浏览器返回上一页的操作, public class Stack<E>extends Vector<E> 是vector的子类. 常用方法: boolean empty()           测试堆栈是否为空.  E peek() 查看堆栈顶部的对象,但不从堆栈中移除它.  E pop() 移除堆栈顶部的对象,并作为此函数的值返回该对象.  E push(E item) 把项压入堆栈顶部.  int search(Object o) 返回对象

【数据结构之旅】顺序栈入门操作

说明: 书中已有关于顺序栈的类型定义.栈初始化.入栈操作,显然这些都是比较理论的算法,书中并没有给出一个完整可以执行的例子,这对初学者学习在理解上会有一定的难度,因此,需要编写一个简单的例子来理解栈的最基本操作. 1.程序功能 通过使用栈来编写一个程序,实现两个数的交换. 2.程序代码及注释 代码及注释如下: #include<stdio.h> #include<stdlib.h>    //导入stdlib.h模块是为了使用sizeof函数 typedef struct{    

数据结构——栈的操作

栈是先进后出的,队列是先进先出的. 栈顶在上面,栈是向上生长的,每次数据操作是压栈,最后的数据元素指向栈顶. 实例:用两个栈实现队列 题目:用两个栈实现一个队列,队列的声明如下,请实现他的连个函数,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 1 template<typename T>class CQueue 2 { 3 public: 4 CQueue(void); 5 ~CQueue(void); 6 void appendTail(const T& node); 7