2021-03-08

数据结构与算法综合实验

【问题描述】
假设一算术表达式中包括三种括号:圆括号"(“和”)",方括号"[“和”]",花括号"{“和”}",且三种括号可按意次序嵌套使用,试编写程序判定输入的表达式所含的括号是否正确配对出现。若匹配,则返回1,否则返回0。

【输入形式】
含括号的算数表达式

【输出形式】
若表达式中的括号正确配对,则输出1。否则,输出0。

【样例输入】

3+(44*[5-{6*[7*(45-10)]}])

【样例输出】

1
#include<stdio.h>
#include<malloc.h>
#include<ctype.h>
typedef struct Stack {
	char* base;
	char* top;
	int stacksize;
}sqstack;
void initstack(sqstack* s) {   //创建线性栈储存字符,容量为100
	s->base = (char*)malloc(100 * sizeof(char));
	s->top = s->base;
	s->stacksize = 100;
}
int push(sqstack* s, char c) {   //入栈操作
	if (s->top - s->base == s->stacksize) {
		return 0;
	}
	*s->top++ = c;
	return 1;
}  
int  pop(sqstack* s, char* e) {    //出栈操作
	if (s->top - s->base == 0)
		return 0;
	else {
		s->top--;
		*e = *s->top;
		return 1;
	}
}
int stackempty(sqstack* s) {        //判断栈空? 栈空返回1  否则返回0
	if (s->top - s->base == 0)
		return 1;
	else return 0;
}
//不满足条件的情况   单独一个左括号
//               ([)]
//                对左右括号的出现次数的判定
//                对不同括号的出现次序的判定。
int main() {
	sqstack s;
	initstack(&s);
	char c;
	char e;
	c = getchar();
	int  n = 0;                                    //记录进入栈中未配对的左括号的个数
	while ((int)isdigit(c) || (int)ispunct(c)) {   //用isdigit和ispunct函数判断是否为数字或者为特殊字符
		if (c != ')' && c != '}' && c != ']')      //将所有除了‘)、}、]’的字符入栈
		{
			if (c == '(' || c == '{' || c == '[')
				n++;
			push(&s, c);
		}
		else if (c == ')')
		{
			while (1) {
				if (!pop(&s, &e))
				{
					printf("0"); 
					return 0;                      //找到栈尾没找到  直接输出0并返回
				}
				else if (e == '(')
				{
					n--;
					break;                         //找到,退出while循环接着找
				}  
				else if (e == '{' || e == '[')
				{
					{
						printf("0");
						return 0;      //找到不符合要求的  直接输出0并返回
					}
				}
			}
		}
		else if (c == ']')
		{
			while (1) {
				if (!pop(&s, &e))
				{
					printf("0");
					return 0;       //找到栈尾没找到  直接输出0并返回
				}
				else if (e == '[')
				{
					n--;
					break;          //找到,退出while循环接着找
				}
				else if (e == '{' || e == '(')
				{
					{
						printf("0");
						return 0;   //找到不符合要求的  直接输出0并返回
					}
				}
			}
		}
		else if (c == '}')
		{
			while (1) {
				if (!pop(&s, &e))
				{
					printf("0");
					return 0;       //找到栈尾没找到  直接输出0并返回
				}
				else if (e == '{')
				{
					n--;
					break;         //找到,退出while循环接着找
				}
				else if (e == '[' || e == '(')
				{

					printf("0");
					return 0;      //找到不符合要求的  直接输出0并返回

				}
			}
		}
		c = getchar();
	}
	if (n != 0)
	{
		printf("0");
		return 0;
	}
	printf("1");
	return 0;
}

【问题描述】

假设给定的整数栈初始状态为空,栈的最大容量为100。从标准输入中输入一组栈操作,按操作顺序输出出栈元素序列。栈操作:1表示入栈操作,后跟一个整数(不为1、0和-1)为入栈元素;0表示出栈操作;-1表示操作结束。

【输入形式】

从标准输入读取一组栈操作,入栈的整数和表示栈操作的整数之间都以一个空格分隔。

【输出形式】

在一行上按照操作的顺序输出出栈元素序列,以一个空格分隔各元素,最后一个元素后也要有一个空格。如果栈状态为空时进行出栈操作,或栈满时进行入栈操作,则输出字符串“error”,并且字符串后也要有一空格。所有操作都执行完后,栈也有可能不为空。

【样例输入】

1 3 1 5 1 7 0 0 1 8 0 1 12 1 13 0 0 0 0 1 90 1 89 0 -1

【样例输出】

7 5 8 13 12 3 error 89

【样例说明】

入栈元素依次为3、5、7,然后有两次出栈动作,所以先输出7和5,这时栈中只有元素3;之后元素8入栈,又出栈,输出8;随后元素12和13入栈,再进行4次出栈操作,输出13、12和3,这时栈为空,再进行出栈操作会输出error;最后90和89入栈,进行一次出栈操作,输出89,栈中剩余1个元素。

#include<stdio.h>
#include<malloc.h>
typedef struct Stack {
	int* base;
	int* top;
	int stacksize;
}sqstack;
void initstack(sqstack* s) {
	s->base = (int*)malloc(100 * sizeof(int));
	s->top = s->base;
	s->stacksize = 100;
}
int push(sqstack* s, int  c) {
	if (s->top - s->base == s->stacksize) {
		return 0;
	}
	*s->top++ = c;
	return 1;
}
int  pop(sqstack* s, int * e) {
	if (s->top - s->base == 0)
		return 0;
	else {
		s->top--;
		*e = *s->top;
		return 1;
	}
}
int stackempty(sqstack* s) {  //栈空返回1  否则返回0
	if (s->top - s->base == 0)
		return 1;
	else return 0;
}
int stackfull(sqstack* s) {   //栈满返回1  否则返回0
	if (s->top - s->base == s->stacksize)
		return 1; 
	else return 0;
}
int main() {
	int a;
	sqstack s;
	initstack(&s);
	scanf("%d", &a);
	while (a != -1) {
		if (a == 1)
		{
			scanf("%d", &a);
			if (stackfull(&s))
				printf("error ");
			else push(&s, a);
		}
		else if (a == 0)
		{
			if (stackempty(&s)) {
				printf("error ");
			}
			else {
				pop(&s, &a);
				printf("%d ",a);
			}
		}
		scanf("%d",&a);
	}
	return 0;
}

【问题描述】
试写一个算法,识别依次读入的一个以"@“为结束符的字符序列是否为形如"序列1&序列2"模式的字符序列。其中序列1和序列2都不含字符”&",且序列2是序列1的逆序列。例如,"a+b&b+a"是属该模式的字符序列,而"1+3&3-1"则不是。

【输入形式】
以@为结尾的一串字符

【输出形式】
若符合模式则输出字符串长度,否则输出no

【样例输入】

a+b&b+a@

【样例输出】

3
#include<stdio.h>
#include<malloc.h>
typedef struct node {
	char data; 
	struct node *next;
}node; 
int push(node* s, char  c) {
	node *q=(node *)malloc(sizeof(node));
	q->data=c;
	q->next=s->next;
	s->next=q;
	return 1;
}
int  pop(node* s, char * e) {
	if (s->next==NULL)
		return 0;
	else {
		node *q=(node *)malloc(sizeof(node)); 
        q=s->next;
        *e=q->data;
        s->next=q->next;
		return 1;
	}
}
int stackempty(node* s) {  //栈空返回1  否则返回0
	if (s->next==NULL)
		return 1;
	else return 0;
}
int main(){
	char c;
	char a; 
	node top;
	top.next=NULL;
	int i=0;//判断是出栈还是入栈
	int n=0;//统计字符串的长度 
	while((c=getchar())!='@'){
		if(c == '&')
		i=1;
		if(i==0&&c!='&'){
			push(&top,c);
			n++;
		}
		else if(i==1&&c!='&'){
			if(stackempty(&top)){
				printf("no");
				return 0;
		    }
			else 
			pop(&top,&a);
			if(a!=c)
			  {
			  	printf("no");
			  	return 0;
			  }
		}
    }
    printf("%d",n);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值