题目:从文件中读取表达式,对其中的“()”“{}”“【】”括号匹配,输出匹配的结果
#include<iostream>
#include<fstream>
#include<malloc.h>
#include<string>
using namespace std;
typedef char SElemType;
typedef int Status;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define STACK_INIT_SIZE 10//初始分配量
#define STACKINCREMENT 2 //存储空间分配增量
typedef struct SqStack
{
SElemType *base; //在栈构造之前和销毁之后,base值为NULL
SElemType *top; //栈顶指针
int stacksize; //当前已分配的存储空间,以元素为单位
}SqStack; //顺序栈
Status InitStack(SqStack *S,int size)
{ /* 初始栈 */
(*S).base=(SElemType *)malloc(size*sizeof(SElemType));
if(!(*S).base)
exit(OVERFLOW);
(*S).top=(*S).base;
(*S).stacksize=size;
return OK;
}
Status StackEmpty(SqStack S)
{ /* 判断栈空 */
if(S.top==S.base)
return TRUE;
else
return FALSE;
}
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)
exit(OVERFLOW);
(*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;
}
void check(char a[],int size)
{
SqStack s;
SElemType *p,e;
if(InitStack(&s,size))
{
p=a;
while(*p!=NULL)
{
// cout<<*p<<endl;
switch(*p)
{
case '{':
case '(':
case '[':Push(&s,*p++);
break;
case '}':
case ')':
case ']':if(!StackEmpty(s))
{
Pop(&s,&e);
if(*p==')'&&e!='('||*p==']'&&e!='[')
{
cout<<("左右括号不配对\n");
exit(ERROR);
}
else
{
p++;
break;
}
}
else
{
cout<<("缺乏左括号\n");
exit(ERROR);
}
default: p++;
}
}
if(StackEmpty(s))
cout<<("括号匹配\n");
else
cout<<("缺乏右括号\n");
}
}
void StrToChar(char a[],string b)
{
for(int i=0;i<b.length();i++)
{
a[i]=b[i];
cout<<a[i];
}
a[b.length()]='\0';
cout<<endl;
}
void main()
{
string str[2];
ifstream infile;
char a[256];
int k=0;
int size;
infile.open("input.txt");
infile>>size;
while(infile.good() &&k<2)
{
getline(infile,str[k]);
k++;
}
infile.close();
cout<<"表达式是:";
StrToChar(a,str[1]);
check(a,size);
}
分享到:
相关推荐
### 一、栈的概念与实现 #### 1. 栈的定义 栈是一种后进先出(Last In First Out, LIFO)的数据结构。这意味着最后插入的数据元素将被最先删除。栈支持两种基本操作:入栈(Push)和出栈(Pop)。 #### 2. 栈的操作 - ...
在本主题中,我们将深入探讨栈与队列的基本概念、操作以及相关的练习问题。 栈(Stack)是一种“后进先出”(Last In First Out, LIFO)的数据结构。它的主要操作包括压入(Push)、弹出(Pop)和查看栈顶元素...
10. 若已知一个栈的入栈序列是 1,2,3,…,n,其输出序列为 p1,p2,p3,…,pn,若 p1=n,则 pi 为 n-i+1。 11. 判定一个栈 ST(最多元素为 m0)为空的条件是 ST->top<>0。 12. 判定一个队列 QU(最多元素为 m0)为满...
通过"链表-栈练习"这个文件,你可以进一步熟悉这些概念并动手实践,这将有助于加深理解并提升编程技能。练习可能包括设计和实现各种操作函数,以及解决实际问题,如实现LRU缓存淘汰策略、表达式求值等。在实践中,要...
栈是一种特殊的、只能在表的一端进行插入或删除操作的线性表。栈的逻辑结构和线性表相同,其最大特点是“后进先出”。栈的存储结构有顺序栈和链栈之分,要求掌握栈的C语言描述方法。 1. 顺序栈 顺序栈是利用地址...
1. **栈的基本概念** 栈是一种线性数据结构,遵循“后进先出”(LIFO)的原则。在栈中,最新的元素总是位于顶部,而最早的元素则位于底部。栈的主要操作包括压栈(将元素添加到顶部)、弹栈(移除顶部元素)和查看...
本篇我们将探讨如何利用两个栈来模拟一个队列,这是数据结构与算法中的一个经典问题。 标题“两个栈实现一个队列”暗示了我们要用到栈的特性来构建一个具有队列行为的数据结构。通常,栈支持两种基本操作:push...
本文将深入探讨如何使用C语言实现从十进制到八进制的转换,以及这一过程中的数据结构——栈的应用。 十进制是我们日常生活最常用的一种计数方式,而八进制则在计算机系统中有着特殊的地位,因为早期的计算机系统...
1. 栈的基本概念 2. 栈的顺序存储表示表示和实现 (1)顺序栈动态分配存储空间方法 和对栈操作设计 (2)顺序栈静态分配存储空间方法 和对栈操作设计 * 3. 栈的链式存储结构——链栈 顺序栈静态分配存储空间方法 和对...
本小练习主要关注栈这一主题,我们将探讨栈的基本概念、操作以及其在实际问题中的应用。 栈是一种线性数据结构,其特点是只能在一端进行插入和删除操作,这一端通常被称为栈顶。在栈中,新添加的元素会压入栈顶,而...
在这个“利用C语言练习栈的基本操作”的主题中,我们将深入探讨如何使用C语言来实现栈这一重要的数据结构。栈是计算机科学中一种特殊的线性数据结构,遵循“后进先出”(LIFO)的原则,常被用于解决各种问题,如括号...
如果一个栈在元素n进栈时发生上溢,这意味着栈的最大容量是n-1,因为栈已经无法容纳新的元素了。两个栈共享内存空间时,为了避免频繁的溢出,应将一个栈的栈顶设在空间的开始,另一个栈的栈顶设在空间的末尾。当两个...
在C语言中,中缀表达式求值是一个常见的编程问题,它涉及到数据结构中的栈这一概念。本题目的目标是设计一个程序,能够...通过这个练习,我们可以更好地掌握栈的使用,以及如何利用栈来处理具有优先级的运算符问题。
1. **栈的结构**:了解栈的基本结构至关重要。栈由帧组成,每个函数调用创建一个新的帧,包含局部变量、返回地址和其他相关数据。栈从高地址向低地址增长,而函数的返回地址通常位于栈帧的顶部。 2. **缓冲区溢出**...
"数据结构第三章栈和队列练习及答案" 本资源摘要信息将详细介绍栈和队列的知识点,包括栈和队列的定义、特点、操作和应用。 一、栈的定义和特点 栈是一种特殊的线性表,它只能在一端进行插入和删除操作。栈的特点...
栈是一种特殊的线性数据结构,它的特点是“后进先出”(Last In First Out,简称LIFO)。在计算机科学中,栈广泛应用于各种算法和数据处理中,例如括号匹配、表达式求值、深度优先搜索等。在本文中,我们将深入探讨...
标题中的“5_栈_”可能是指一系列关于栈的数据结构问题中的第五个主题,而描述则具体提到了如何使用栈来解决一个特定的算法问题——判断一个字符串是否为回文。回文是一种特殊的字符串,其正读和反读是一样的,比如...
1. **进栈**(Push):将一个元素压入栈顶。在本例中,`push()`函数接收一个指向`linkStack`类型的指针`p`和一个整数`x`作为参数。它首先创建一个新的`stackNode`,将`x`赋值给新节点的`data`,然后将新节点链接到...
1. 创建两个栈,一个用于存储运算符(运算符栈),另一个用于临时存储处理过的中缀表达式的元素(临时栈)。 2. 从左到右扫描中缀表达式中的每一个字符: - 如果是数字,直接将其压入临时栈。 - 如果是运算符,与...
1. 初始化一个空栈。 2. 从左到右遍历表达式,遇到数字就压入栈,遇到运算符则比较优先级。 3. 当遇到运算符时,根据优先级规则进行运算:如果栈不为空,且当前运算符优先级高于栈顶运算符,或者当前运算符为左括号...