数据结构与算法综合实验
【问题描述】
假设一算术表达式中包括三种括号:圆括号"(“和”)",方括号"[“和”]",花括号"{“和”}",且三种括号可按意次序嵌套使用,试编写程序判定输入的表达式所含的括号是否正确配对出现。若匹配,则返回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);
}